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

我经常需要按组(本例中为医院)生成多份报告,在每家医院内,可能有许多不同的病房需要我报告结果.之前,我使用循环在R中运行所有绘图和分析,然后开始复制/粘贴工作;然而,在阅读了这篇文章(Can Sweave produce many pdfs automatically?篇)之后,它给了我希望,我可能真的能够跳过许多步骤,直接从R到Rnw/knitr报告.

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

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


##  Here is my current work flow-- produce all plots, but export as png and cut/paste
for(hosp in unique(df$Hospital)){
  subgroup <- df[ df$Hospital == hosp,]
  for(ward in unique(subgroup$Ward)){
    subgroup2 <- subgroup[subgroup$Ward == ward,]
    savename <- paste(hosp, ward)
    plot(subgroup2$Month, subgroup2$Outcomes, type="o", main=paste("Trend plot for", savename))
  }
}
# followed by much copy/pasting


##  Here is what I'm trying to go for using knitr 
library(knitr)
for (hosp in unique(df$Hospital)){
  knit("C:file.path\\testing_loops.Rnw", output=paste('report_', Hospital, '.tex', sep=""))
}

## With the following *Rnw file
## start *.Rnw Code
\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 == 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}


##  To be then turned into pdf with this
tools::texi2pdf("C:file.path\\report_A.tex", clean = TRUE, quiet = TRUE)

在try 运行knit()代码块后,出现以下错误:

Error in file(con, "w") : invalid 'description' argument

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

推荐答案

您不需要在.Rnw文件中重新定义数据,我认为警告来自这样一个事实:您将输出名称与Hospital(医院的完整向量)而不是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}

而驱动程序R文件只是

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

R相关问答推荐

将Multilinetring合并到一个线串中,使用sf生成规则间隔的点

将模拟变量乘以多个观测结果中的模拟变量

如何创建构成多个独立列条目列表的收件箱框列?

如何在四进制仪表板值框中显示值(使用shiny 的服务器计算)

根据R中的另一个日期从多列中 Select 最近的日期和相应的结果

R Markdown中的交叉引用表

名称输出pmap on tible

将年度数据插入月度数据

用预测NLS处理R中生物学假设之上的误差传播

当月份额减go 当月份额

根据列A中的差异变异列,其中行由列B中的相对值标识

将一个字符串向量调整为与其他字符串向量完全相同的大小

按列中显示的配对组估算NA值

仅当后续值与特定值匹配时,才在列中回填Nas

带RStatix的Wilcoxon环内检验

长/纬点继续在堪萨斯-SF结束,整齐的人口普查

如何在shiny 的应用程序 map 视图宣传单中可视化单点

将仪表板中的值框大小更改为Quarto

如何将一列相关性转换为R中的相关性矩阵

从data.table列表中提取特定组值,并在R中作为向量返回