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

时间:2011-12-15 11:10:17

标签: r sweave knitr

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

我的流程是这样的:

  1. 首先准备要显示的数据的RStudio,保存在X.Rda。
  2. 在X.Rnw(RStudio)中,我阅读了X.Rda,选择了一个城市,并制作了表格和图表。
  3. 在RStudio中,按“编译PDF”,生成城市报告X.pdf。
  4. 我转到第2步,选择其他城市,依此类推。
  5. 这非常繁琐,看起来非常适合每个城市的循环,但它怎么能完成?

    谢谢r-contributors!

    /克里斯

2 个答案:

答案 0 :(得分:27)

您可以使用类似for循环的全局变量更改,它可以控制您要编入报表的城市;请参阅其他帖子Run Sweave or knitr with objects from existing R session

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

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

city_template.Rnw内,你有一个像

这样的大块
<<do-my-job>>=
make_plot(city, ...)
whatever(city, ...)
@

然后你将获得一系列由城市命名的tex文件,你的工作的其余部分是将它们编译成PDF(RStudio不可能编译多个tex文件,AFAIK,但是它很简单。命令行或在带有texi2dvi())的R中。

您需要注意一件事 - 您必须为每个输出文件使用不同的数字前缀(选项fig.path),否则不同的城市可以覆盖彼此的数字输出。在knitr中,可以通过以下方式完成:

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

我认为通过循环生成许多报告应该是安全的。

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

答案 1 :(得分:0)

  • 在R environnent中这样做。
  • 将特定城市的所有输出放入列表
  • 用块来编写你的RnW只需调用输出
  • 将您的R图像保存在与Sweave报告相同的文件夹中,并将wd设置为同一文件夹
  • Sweave(&#34; yourfile.RnW&#34;,output =&#34; yourcity.tex&#34;)
  • 使用texi2dvi从R
  • 编译tex文件

如果你有很多城市,你应该把它放到一个功能中。