【问题标题】:Dynamically Generate PDF Reports with Sweave使用 Sweave 动态生成 PDF 报告
【发布时间】:2012-01-05 06:52:30
【问题描述】:

我想生成大量报告。为简单起见,假设我想创建 5 个小的 pdf 文档,其中只有一个简单的标题,该标题在名称向量中循环。

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

我将如何循环生成这些报告:

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

提前致谢!

PS:向我展示如何定义生成的 PDF 文档的名称的奖励积分。

【问题讨论】:

    标签: r latex sweave


    【解决方案1】:

    你可以循环调用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))
    }
    

    【讨论】:

    • 谢谢文森特,我对 Sweave 的不熟悉导致了一些麻烦。
    【解决方案2】:

    我更喜欢使用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')
    

    【讨论】:

    • 我不确定我是否理解 是如何被矢量名称列表中的元素替换的,但在我的现实生活中,我需要大约 20 或 30 个数据点能够添加,包括数字 - 我不确定我能看到我将如何扩展这一点。 l_ply 的有趣用法。
    • &lt;%= title %&gt;brew 语法,当您brew 模板时解决。如果您可以发布更多关于您的文档的variable 元素的详细信息,我可以帮助设置正确的brew 模板。
    • 有一些图像是动态生成的(ggplot),其余的只是被分流到适当位置的数字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多