Can Sweave会自动生成许多pdf吗?

Chr*_*ris 20 r sweave knitr

我分析来自许多城市的测量数据(数百个),并且需要为每个城市创建单独的报告(采用Adobe pdf格式).

我的过程是这样的:

  1. 第一个RStudio准备要显示的数据,保存在X.Rda中.
  2. 在X.Rnw(RStudio)中,我读了X.Rda,选择一个城市,并生成表格和图表.
  3. 在RStudio我按"编译PDF",生成城市报告X.pdf.
  4. 我转到第2步,选择另一个城市,依此类推.

这非常繁琐,看起来非常适合每个城市的循环,但它怎么能完成呢?

谢谢r-contributors!

/克里斯

Yih*_*Xie 27

您可以使用类似for循环的全局变量,它可以控制您想要编入报表的城市; 请参阅另一篇文章Run Sweave或knitr与现有R会话中的对象

代码就像(假设cities是一个字符向量,我使用knitr包作为示例,因为您可以指定输出的文件名):

for (city in cities) {
   knit('city_template.Rnw', output = paste('report_', city, '.tex', sep = ''))
}
Run Code Online (Sandbox Code Playgroud)

在里面city_template.Rnw,你有一块像

<<do-my-job>>=
make_plot(city, ...)
whatever(city, ...)
@
Run Code Online (Sandbox Code Playgroud)

然后你将获得一系列由城市命名的tex文件,你的工作的其余部分是将它们编译成PDF(RStudio不可能编译多个tex文件,AFAIK,但是在命令行中执行它或者它是微不足道的在R with texi2dvi()).

有一件事你需要小心 - 你必须fig.path为每个输出文件使用不同的数字前缀(选项),否则不同的城市可以覆盖彼此的数字输出.在knitr,这可以通过这样做:

<<setup, echo=FALSE>>=
opts_chunk$set(fig.path = paste('my-prefix-', city, sep = ''))
@
Run Code Online (Sandbox Code Playgroud)

我相信通过循环生成许多报告应该是安全的.

顺便说一句,你可以用Sweave达到同样的目标; 也许你会知道我之后开发的原因knitr(这是偏离主题的,所以我不会在这里扩展).