使用officer生成参数化ppt报告
Generate parameterized ppt reports using officer
使用下面的代码,我能够为 mtcars
数据集的子集生成 ppt 报告:
library(ggplot2)
library(tidyverse)
library(patchwork)
library(officer)
library(officedown)
library(glue)
small <- mtcars %>%
filter(carb %in% c(1, 2))
p1 <- ggplot(mpg, wt, data = small, colour = cyl)
p2 <- ggplot(mpg, data = small) + ggtitle("small")
p <- p1 | p2
template_pptx <- read_pptx()
report <- add_slide(template_pptx, layout = "Title and Content", master = "Office Theme") %>%
ph_with(value=p, location = ph_location_label(ph_label = "Content Placeholder 2"))
print(report, target=glue('report for small car.pptx'))
现在假设我们还需要为以下数据集重现报告生成过程:
middle <- mtcars %>%
filter(carb %in% c(3, 4))
large <- mtcars %>%
filter(carb %in% c(6, 8))
我的想法是将多个ggplots部分转成一个函数保存在一个脚本plot.R
中,然后我会写一个名为main.R
的伪代码脚本到运行整个过程并生成分别针对小型、中型、大型数据集的 3 个报告:
# main.R
for i in c(small, middle, large){
source('plot.R')
# maybe need to import and run plot function() from plot.R
# save figure to ppt
template_pptx <- read_pptx("./ppt_template.pptx")
report <- add_slide(template_pptx, layout = "Title and Content", master = "Office Theme") %>%
ph_with(value=p, location = ph_location_label(ph_label = "Content Placeholder 2"))
print(report, target=glue('report for {i} car.pptx'))
}
我遇到的问题是我不知道如何将绘图代码转换为函数并将参数(也许保存一个 config.yaml
文件以防我们有很多参数?)传递给预定义函数,以及终于生成参数化报告了?
非常感谢您提前提出意见和帮助。
参考文献:
R: multiple ggplot2 plot using d*ply
https://cran.r-project.org/web/packages/egg/vignettes/Ecosystem.html
R - How to generate parameterized reports via nested tibbles + pwalk(rmarkdown::render)
您可以将您的绘图代码放在一个函数中,例如接受两个参数,一个数据框 (x) 和一个标题。
同样将准备pptx的代码放在一个函数中,例如接受两个参数,一个数据框 (x) 和一个标题或文件名或 ...
在我下面的代码中,我将您的三个数据集放在一个列表中,然后使用 purrr::iwalk
循环遍历该列表,为每个数据集制作一个 pptx 报告。使用 purrr::iwalk
数据集的名称作为第二个参数传递给报告函数。
library(ggplot2)
library(patchwork)
library(dplyr)
library(purrr)
library(officer)
library(glue)
plot_fun <- function(x, title) {
p1 <- ggplot(data = x, aes(mpg, wt, colour = cyl))
p2 <- ggplot(data = x, aes(mpg)) + ggtitle(title)
p1 | p2
}
pptx_fun <- function(x, y) {
p <- plot_fun(x, title = y)
template_pptx <- read_pptx()
report <- add_slide(template_pptx, layout = "Title and Content", master = "Office Theme") %>%
ph_with(value = p, location = ph_location_label(ph_label = "Content Placeholder 2"))
print(report, target=glue('report for {y} car.pptx'))
}
data_list <- lapply(list(small = 1:2, medium = 3:4, large = 5:6), function(x) filter(mtcars, carb %in% x))
purrr::iwalk(data_list, pptx_fun)
使用下面的代码,我能够为 mtcars
数据集的子集生成 ppt 报告:
library(ggplot2)
library(tidyverse)
library(patchwork)
library(officer)
library(officedown)
library(glue)
small <- mtcars %>%
filter(carb %in% c(1, 2))
p1 <- ggplot(mpg, wt, data = small, colour = cyl)
p2 <- ggplot(mpg, data = small) + ggtitle("small")
p <- p1 | p2
template_pptx <- read_pptx()
report <- add_slide(template_pptx, layout = "Title and Content", master = "Office Theme") %>%
ph_with(value=p, location = ph_location_label(ph_label = "Content Placeholder 2"))
print(report, target=glue('report for small car.pptx'))
现在假设我们还需要为以下数据集重现报告生成过程:
middle <- mtcars %>%
filter(carb %in% c(3, 4))
large <- mtcars %>%
filter(carb %in% c(6, 8))
我的想法是将多个ggplots部分转成一个函数保存在一个脚本plot.R
中,然后我会写一个名为main.R
的伪代码脚本到运行整个过程并生成分别针对小型、中型、大型数据集的 3 个报告:
# main.R
for i in c(small, middle, large){
source('plot.R')
# maybe need to import and run plot function() from plot.R
# save figure to ppt
template_pptx <- read_pptx("./ppt_template.pptx")
report <- add_slide(template_pptx, layout = "Title and Content", master = "Office Theme") %>%
ph_with(value=p, location = ph_location_label(ph_label = "Content Placeholder 2"))
print(report, target=glue('report for {i} car.pptx'))
}
我遇到的问题是我不知道如何将绘图代码转换为函数并将参数(也许保存一个 config.yaml
文件以防我们有很多参数?)传递给预定义函数,以及终于生成参数化报告了?
非常感谢您提前提出意见和帮助。
参考文献:
R: multiple ggplot2 plot using d*ply
https://cran.r-project.org/web/packages/egg/vignettes/Ecosystem.html
R - How to generate parameterized reports via nested tibbles + pwalk(rmarkdown::render)
您可以将您的绘图代码放在一个函数中,例如接受两个参数,一个数据框 (x) 和一个标题。
同样将准备pptx的代码放在一个函数中,例如接受两个参数,一个数据框 (x) 和一个标题或文件名或 ...
在我下面的代码中,我将您的三个数据集放在一个列表中,然后使用 purrr::iwalk
循环遍历该列表,为每个数据集制作一个 pptx 报告。使用 purrr::iwalk
数据集的名称作为第二个参数传递给报告函数。
library(ggplot2)
library(patchwork)
library(dplyr)
library(purrr)
library(officer)
library(glue)
plot_fun <- function(x, title) {
p1 <- ggplot(data = x, aes(mpg, wt, colour = cyl))
p2 <- ggplot(data = x, aes(mpg)) + ggtitle(title)
p1 | p2
}
pptx_fun <- function(x, y) {
p <- plot_fun(x, title = y)
template_pptx <- read_pptx()
report <- add_slide(template_pptx, layout = "Title and Content", master = "Office Theme") %>%
ph_with(value = p, location = ph_location_label(ph_label = "Content Placeholder 2"))
print(report, target=glue('report for {y} car.pptx'))
}
data_list <- lapply(list(small = 1:2, medium = 3:4, large = 5:6), function(x) filter(mtcars, carb %in% x))
purrr::iwalk(data_list, pptx_fun)