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

时间:2015-05-24 09:34:45

标签: r pdf dynamic report knitr

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

之前的帖子(Using loops with knitr to produce multiple pdf reports... need a little help to get me over the hump)已经处理了从 .Rnw 文件生成的多个pdf报告的创建。我尝试按如下方式应用该方法:

#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=''))

1 个答案:

答案 0 :(得分:12)

调整您的示例:

您需要一个.rmd&#34;模板&#34;文件。它可能是这样的,保存为template.rmd

This is a subgroup report.

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

然后,您需要一个R脚本来加载您想要的数据,遍历数据子集以及每个子集

  1. 定义模板中使用的subgroup对象
  2. 将模板渲染为所需的输出
  3. 所以,在这个单独的脚本中

    # 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文件,每个文件都包含不同数据子集的摘要。

    请注意,如果您尝试点击&#34;编织&#34;这将无效 RStudio中的按钮,因为它在单独的R会话中运行R代码。但是,当您使用render(或knit2pdf)显式从控制台运行时,rmd文件中的R代码仍然可以访问全局环境。

    实现此目标的另一个选择是使用brew包。