使用knitr循环生成多个pdf报告。。。需要一点帮助我渡过难关吗

使用knitr循环生成多个pdf报告。。。需要一点帮助我渡过难关吗,r,knitr,R,Knitr,首先,我必须承认,我对knitr和可复制分析的概念非常陌生,但我可以看到它在改进我当前的工作流程(包括将大量副本粘贴到word文档中)方面的潜力 我经常需要按组(本例中为医院)生成多个报告,并且在每个医院内,可能有许多不同的病房需要我报告结果。以前我使用循环在R中运行所有绘图和分析,然后开始复制/粘贴工作;然而,在阅读了这篇文章()之后,它给了我希望,我实际上可以跳过许多步骤,直接从R通过Rnw/knitr报告 但是,在尝试之后,我发现有一些问题没有完全解决(因为Rnw中的R环境似乎无法识别我试

首先,我必须承认,我对knitr和可复制分析的概念非常陌生,但我可以看到它在改进我当前的工作流程(包括将大量副本粘贴到word文档中)方面的潜力

我经常需要按组(本例中为医院)生成多个报告,并且在每个医院内,可能有许多不同的病房需要我报告结果。以前我使用循环在R中运行所有绘图和分析,然后开始复制/粘贴工作;然而,在阅读了这篇文章()之后,它给了我希望,我实际上可以跳过许多步骤,直接从R通过Rnw/knitr报告

但是,在尝试之后,我发现有一些问题没有完全解决(因为Rnw中的R环境似乎无法识别我试图传递给它的循环变量??)


当我查看创建*.tex文件的目录时,我可以看到A医院生成的2个pdf绘图(B没有),也没有医院特定的*.tex文件编织成pdf。提前感谢您提供的任何帮助

好问题!这与你在问题中提供的其他信息一起对我有效。请注意,我已将您的
hosp
替换为
x
。我已经调用了您的
Rnw
文件
test.Rnw

# input data
Hospital <- c(rep("A", 20), rep("B", 20))
Ward <- rep(c(rep("ICU", 10), rep("Medicine", 10)), 2)
Month <- rep(seq(1:10), 4)
Outcomes <- rnorm(40, 20, 5)
df <- data.frame(Hospital, Ward, Month, Outcomes)

# generate the tex files, one for each hospital in df
library(knitr)
lapply(unique(df$Hospital), function(x) 
       knit("C:\\emacs\\test.rnw", 
            output=paste('report_', x, '.tex', sep="")))

# generate PDFs from the tex files, one for each hospital in df
lapply(unique(df$Hospital), function(x)
       tools::texi2pdf(paste0("C:\\emacs\\", paste0('report_', x, '.tex')), 
                       clean = TRUE, quiet = TRUE))

结果是两个tex文件(report_A.tex、report_B.tex)、四个用于数字的pdf文件(A1、A2、B1、B2)和两个用于报告的pdf文件(report_A.pdf、report_B.pdf),每个文件中都有数字。这就是您想要的吗?

您不需要在
.Rnw
文件中重新定义数据,我认为警告来自这样一个事实:您将输出名称与
医院(医院的完整向量)而不是
hosp
(循环索引)放在一起

按照您的示例,
testingloops.Rnw

\documentclass[10pt]{article}
\usepackage[margin=1.15 in]{geometry}
<<loaddata, echo=FALSE, message=FALSE>>=
subgroup <- df[ df$Hospital == hosp,]
@

\begin{document}
<<setup, echo=FALSE >>=
  opts_chunk$set(fig.path = paste("test", hosp , sep=""))
@

Some infomative text about hospital \Sexpr{hosp}

<<plots, echo=FALSE >>=
  for(ward in unique(subgroup$Ward)){
    subgroup2 <- subgroup[subgroup$Ward == ward,]
    #     subgroup2 <- subgroup2[ order(subgroup2$Month),]
    savename <- paste(hosp, ward)
    plot(subgroup2$Month, subgroup2$Outcomes, type="o", main=paste("Trend plot for", savename))
  }
@
\end{document}
\documentclass[10pt]{article}
\usepackage[margin=1.15英寸]{geometry}
=

小组在这个回答中,我打算回答一个更一般的问题: “使用循环生成多个pdf报告”,而不是您的特定示例。这是因为这一趋势很难作为一个noob来遵循。我最终设法让它工作(html版本),所以这是我谦逊的解决方案。这里可能有一些更好的,我只是还不能完全理解

  • 使用您的设计创建RMD文件,并将其保存在working\input中 目录(在Rstudio:file->newfile->R markdown中)。这个文件应该 在报告中包含绘制图所需的所有函数(只需在其中一个代码块中声明它们)。 将此文件视为所有未来报告的模板。别担心 关于在早些时候将数据消化后将其传递到其环境中-我将 在第(2)段中说明。要理解的关键问题是,所有计算都是 在管道的下游完成(在渲染RMD时) 文件)

  • 创建需要在差异控制r文件中使用的循环。在我的例子中,有一个循环 迭代目录中的所有文件,并将它们转换为数据 框架然后我想把这些数据帧连同 其他数据变量,以便绘制它们。这就是它的工作方式:


    绝对地在所有人身上运行!我(现在)很难让第二个lappy块在工具中循环时正常工作:texi2pdf,但我自己可以解决这个问题。刚刚有了第一个lapply knit my*.tex文件真是太棒了!非常非常感谢!!很高兴这有帮助,您是否尝试过Brian Diggs的答案中的knit2pdf
    ?您可以将第二个
    lappy
    替换为:
    库(knitr);lappy(独特的(df$Hospital),功能(x)knit2pdf(“C:\\emacs\\test.rnw”,output=paste0('report_',x,.tex'))
    通过“替换”我的意思是“废除”第二个
    lappy
    ,对不起。布莱恩,我的机器(出于某种原因)更喜欢knit2pdf,而不是lappy工具::texi2pdf!太棒了@Brian Diggs,我不确定您是否仍在监视这个,但是,如果我想在每个病房的绘图之后插入描述性文本,那么在.Rnw文件的绘图代码循环中,您知道最好的方法是什么?我尝试在绘图之后插入cat(“这是关于\\Sexpr{ward}的信息文本”)。我还打开了代码块选项tidy.opts=list(comment=“”),但knit2pdf将文本放在两个绘图之后,而不是像我所希望的那样放在循环中的每个绘图之下。此外,在编译过程中,\”会导致一个转义错误(?)。我在每个绘图后添加
    cat(“这是关于”,ward的信息性文本)
    。只需要一点信息就可以了。但是,如果您想循环使用更复杂的报告,请查看
    knit_child
    和020的示例。在过去几年中,是否有任何变化会使这种方法不再有效?我做不到。我在一个figure文件夹中获得了tex文件和图像的PDF,但最终的PDF无法编译。
    # input data
    Hospital <- c(rep("A", 20), rep("B", 20))
    Ward <- rep(c(rep("ICU", 10), rep("Medicine", 10)), 2)
    Month <- rep(seq(1:10), 4)
    Outcomes <- rnorm(40, 20, 5)
    df <- data.frame(Hospital, Ward, Month, Outcomes)
    
    # generate the tex files, one for each hospital in df
    library(knitr)
    lapply(unique(df$Hospital), function(x) 
           knit("C:\\emacs\\test.rnw", 
                output=paste('report_', x, '.tex', sep="")))
    
    # generate PDFs from the tex files, one for each hospital in df
    lapply(unique(df$Hospital), function(x)
           tools::texi2pdf(paste0("C:\\emacs\\", paste0('report_', x, '.tex')), 
                           clean = TRUE, quiet = TRUE))
    
    \documentclass[10pt]{article}
    \usepackage[margin=1.15 in]{geometry}
    <<loaddata, echo=FALSE, message=FALSE>>=
      Hospital <- c(rep("A", 20), rep("B", 20))
    Ward <- rep(c(rep("ICU", 10), rep("Medicine", 10)), 2)
    Month <- rep(seq(1:10), 4)
    Outcomes <- rnorm(40, 20, 5)
    df <- data.frame(Hospital, Ward, Month, Outcomes)
    subgroup <- df[ df$Hospital == x,]
    @
    
    \begin{document}
    <<setup, echo=FALSE >>=
      opts_chunk$set(fig.path = paste("test", x , sep=""))
    @
    
    Some informative text about hospital \Sexpr{x}
    
    <<plots, echo=FALSE >>=
      for(ward in unique(subgroup$Ward)){
        subgroup2 <- subgroup[subgroup$Ward == ward,]
        #     subgroup2 <- subgroup2[ order(subgroup2$Month),]
        savename <- paste(x, ward)
        plot(subgroup2$Month, subgroup2$Outcomes, type="o", main=paste("Trend plot for", savename))
      }
    @
    \end{document}
    
    \documentclass[10pt]{article}
    \usepackage[margin=1.15 in]{geometry}
    <<loaddata, echo=FALSE, message=FALSE>>=
    subgroup <- df[ df$Hospital == hosp,]
    @
    
    \begin{document}
    <<setup, echo=FALSE >>=
      opts_chunk$set(fig.path = paste("test", hosp , sep=""))
    @
    
    Some infomative text about hospital \Sexpr{hosp}
    
    <<plots, echo=FALSE >>=
      for(ward in unique(subgroup$Ward)){
        subgroup2 <- subgroup[subgroup$Ward == ward,]
        #     subgroup2 <- subgroup2[ order(subgroup2$Month),]
        savename <- paste(hosp, ward)
        plot(subgroup2$Month, subgroup2$Outcomes, type="o", main=paste("Trend plot for", savename))
      }
    @
    \end{document}
    
    ##  make my data
    Hospital <- c(rep("A", 20), rep("B", 20))
    Ward <- rep(c(rep("ICU", 10), rep("Medicine", 10)), 2)
    Month <- rep(seq(1:10), 4)
    Outcomes <- rnorm(40, 20, 5)
    df <- data.frame(Hospital, Ward, Month, Outcomes)
    
    ## knitr loop
    library("knitr")
    for (hosp in unique(df$Hospital)){
      knit2pdf("testingloops.Rnw", output=paste0('report_', hosp, '.tex'))
    }