R Knitr PDF。是否有可能通过一个循环自动保存PDF报告(从.Rmd生成)?

问题描述 投票:12回答:1

我想创建一个循环,允许我自动保存PDF报告,这是从一个 "Rmd "生成的。.Rmd 文件。例如,如果一个变量 "ID "有10行,我想让R自动给我保存10个报表,放到一个特定的目录中。这些报表应根据所选ID的不同而不同。

之前的一篇文章(使用循环与knitr生成多个pdf报告......需要一点帮助,让我克服困难。)已经处理了创建多个pdf报告的问题,这些报告是由下列文件生成的。.Rnw 文件。我试着应用如下方法。

#Data

```{r, include=FALSE}
set.seed(500)
Score <- rnorm(40, 100, 15)
Criteria1<-rnorm(40, 10, 5)
Criteria2<-rnorm(40, 20, 5)
ID <- sample(1:1000,8,replace=T)
df <- data.frame(ID,Score,Criteria1,Criteria2)

#instead of manually choosing the ID:

subgroup<- subset(df, ID==1) 

# I would like to subset the Data through a loop. My approach was like like this:

for (id in unique(df$ID)){
subgroup<- df[df$ID == id,]}

```

```{r, echo=FALSE}
#Report Analysis

summary(subgroup)
```
#Here will be some text about the summary.



# At the end the goal is to produce automatic pdf reports with the ID name as a filename:

library("rmarkdown")
render("Automated_Report.rmd",output_file = paste('report.', id, '.pdf', sep=''))
r pdf dynamic report knitr
1个回答
18
投票

改编你的例子。

你需要一个 .rmd "模板 "文件。可以是这样的,保存为 template.rmd.

This is a subgroup report.

```{r, echo=FALSE}
#Report Analysis
summary(subgroup)
```

然后,你需要一个R脚本,它将加载你想要的数据,循环浏览数据子集,并为每个子集提供

  1. 定义 subgroup 模板中的对象
  2. 将模板渲染成所需的输出

所以,在这个 单行本:

# load data 
set.seed(500)
Score <- rnorm(40, 100, 15)
Criteria1<-rnorm(40, 10, 5)
Criteria2<-rnorm(40, 20, 5)
ID <- sample(1:1000,8,replace=T)
df <- data.frame(ID,Score,Criteria1,Criteria2)

library("rmarkdown")

# in a single for loop
#  1. define subgroup
#  2. render output
for (id in unique(df$ID)){
    subgroup <- df[df$ID == id,]
    render("template.rmd",output_file = paste0('report.', id, '.html'))    
}

这在我的工作目录中产生了8个html文件,每个文件都有不同数据子集的摘要。

请注意,这将 不灵 如果您尝试点击RStudio内部的 "knit "按钮,因为这将在一个单独的R会话中运行R代码。然而,当您从控制台明确地使用 render (或 knit2pdf) rmd文件中的R代码仍然可以访问全局环境。

与其依赖全局变量,另一个选择是使用 参数化报告,在YAML头中定义参数,并将参数值作为参数传递给 rmarkdown::render.

© www.soinside.com 2019 - 2024. All rights reserved.