2012-01-05 168 views
4

我想生成大量报告。为了简单起见,假设我想创建5个小的pdf文档,只有一个简单的标题可以循环使用一个名称向量。使用Sweave动态生成PDF报告

\documentclass[12pt]{article} 
\newcommand{\dsfrac}[2]{\frac{\displaystyle #1}{\displaystyle #2}} 
\author{Me} 
\title{\Sexpr{print(namelist)}} 
\maketitle 
\end{document} 

我怎么会去通过这些报告生成的循环:

​​

提前感谢!

PS:用于向我显示如何定义生成的PDF文档名称的奖励分数。

回答

7

您可以在循环中调用Sweave,如下所示。

# Create the template file, "test.Rnw" 
template <- "test.Rnw" 
cat(" 
\\documentclass{article} 
\\title{\\Sexpr{namelist[i]}} 
\\begin{document} 
\\maketitle 
\\end{document} 
", file=template) 

# Parameters 
namelist <- c("Tom","Dick","Harry","John","Jacob") 

# Main loop: just compile the file, 
# it will use the current value of the loop variable "i". 
for(i in 1:length(namelist)) { 
    Rnw_file <- paste("test_", i, ".Rnw", sep="") 
    TeX_file <- paste("test_", i, ".tex", sep="") 
    file.copy(template, Rnw_file) 
    Sweave(Rnw_file) 
    system(paste("pdflatex --interaction=nonstopmode", TeX_file)) 
} 
+0

谢谢文森特,我对Sweave的熟悉程度不够,引起了一阵拉发。 – 2012-01-05 11:33:06

5

我更喜欢使用brew + Sweave/knitr做这种模板。这是我的做法:

# CREATE A BREW TEMPLATE ON FILE: template.brew 
\documentclass[12pt]{article} 
\newcommand{\dsfrac}[2]{\frac{\displaystyle #1}{\displaystyle #2}} 
\author{Me} 
\title{<%= title %>} 
\begin{document} 
\maketitle 
\end{document} 

# FUNCTION TO BREW AND WEAVE TEMPLATE TO PDF 
gen_pdf <- function(title){ 
    rnw_file <- sprintf("%s.rnw", title) 
    tex_file <- sprintf("%s.tex", title) 
    brew('template.brew', rnw_file) 
    Sweave(rnw_file) 
    tools::texi2pdf(tex_file, clean = TRUE, quiet = TRUE) 
    unlink(c(rnw_file, tex_file)) 
} 

# GENERATING THE PDF FILES 
namelist <- c("Tom","Dick","Harry","John","Jacob") 
plyr::l_ply(namelist, gen_pdf, .progress = 'text') 
+0

我不确定我了解<%= title %>如何被向量名称列表中的元素替换,但在我的真实生活情况中,我需要添加大约20或30个数据点,包括数字 - 我不确定我可以看到我将如何扩展这一点。 'l_ply'的有趣用法。 – 2012-01-05 12:59:09

+1

'<%= title %>'是'brew'语法,当您冲煮模板时会解析该语法。如果您可以在文档的'variable'元素上发布更多细节,我可以帮助设置正确的'brew'模板。 – Ramnath 2012-01-05 15:32:19

+0

有几张图片是动态生成的(ggplot),其余的只是数字被分流到位。 – 2012-01-06 11:42:24