如何从单个数据框中创建具有不同内容的多个 PDF?

Posted

技术标签:

【中文标题】如何从单个数据框中创建具有不同内容的多个 PDF?【英文标题】:How to create multiple PDFs with different content from a single data frame? 【发布时间】:2017-04-11 15:43:30 【问题描述】:

问题

我想从一个数据框中编织多个 PDF。因此我尝试了各种解决方案,但我对 R、R Studio、LaTex、knitr 的了解非常有限,所以我无法适应一些解决方案,最后自己尝试了。我实际上认为我的代码绝对不是您实际用来实现我想要实现的目标的方式。所以,请随时告诉我可以/应该改进的地方和地方。

如果能得到一些帮助,我将不胜感激。我已经在谷歌上搜索了几个小时,如果你能推荐我任何教程/指南/解释,我也将不胜感激。我什至不知道从哪里开始。

当前状态:已解决

代码

main.R

for(i in 1:nrow(mtcars)) 
  g_title <- rownames(mtcars)[i]
  knit2pdf(input  = "main.Rnw", 
           output = paste0("output\\", g_title, ".pdf"), 
           quiet  = FALSE, 
           envir  = parent.frame())

模板.Rnw

\documentclassarticle
\usepackage[ngerman]babel

\begindocument
\begintitlepage
  Titlepage
\endtitlepage

\tableofcontents
\newpage

\sectionTopic 1
\newpage

\sectionTopic 2    

\enddocument

解决方法

全局变量

我尝试创建由 for 循环更改的全局变量。这些变量然后以函数的形式在 .Rnw 文件中使用。由于未知错误,我无法使其正常工作。

.R 文件中的代码:

printPlot <- function() 
  print(g_plot)


for(i in 1:nrow(mtcars)) 
  g_title <- rownames(mtcars)[i]
  g_plot  <- ggplot(mtcars[i,], aes(x = cyl, y = disp) ) + 
             geom_point()
  knit2pdf(input  = "main.Rnw", 
           output = paste0("output\\", g_title, ".pdf"), 
           quiet  = FALSE, 
           envir  = parent.frame())

.Rnw 文件中的代码:

<<>>=
printPlot()
@

错误:

PDF 已创建,但内容混乱。您可以在“当前状态”下的图片中看到它。

我还收到几条错误/警告消息,例如:

警告信息: 1:运行命令'"C:\Users\Marc\AppData\Local\Programs\MIKTEX~1.9\miktex\bin\x64\texify.exe" --quiet --pdf "Mazda RX4.pdf" --max-iterations=20 -I "C:/PROGRA~1/R/R-33~1.2/share/texmf/tex/latex" -I "C:/PROGRA~1/R/R-33~1.2/share/texmf/bibtex/bst"' 状态为 1 2:运行命令'"C:\Users\Marc\AppData\Local\Programs\MIKTEX~1.9\miktex\bin\x64\texify.exe" --quiet --pdf "Mazda RX4 Wag.pdf" --max-iterations=20 -I "C:/PROGRA~1/R/R-33~1.2/share/texmf/tex/latex" -I "C:/PROGRA~1/R/R-33~1.2/share/texmf/bibtex/bst"' 状态为 1

制作文件

我刚第一次阅读有关 makefile 的内容。也许这可以帮助解决问题。

如果我没听错,makefile 将与 Markdown 一起使用,而不是直接与 LaTex 一起使用。这似乎是性能的巨大损失。这一点对我来说很重要,所以我会尝试寻找其他解决方案。

其他 SO 问题

在大多数情况下,我尝试调整代码,但都失败了,因为我缺少了解给定解决方案的知识。

R Knitr PDF: Is there a posssibility to automatically save PDF reports (generated from .Rmd) through a loop? Using loops with knitr to produce multiple pdf reports… need a little help to get me over the hump Can Sweave produce many pdfs automatically?

【问题讨论】:

【参考方案1】:

从这个问题来看,我并不完全确定预期的输出,但概念很清楚。虽然任务本身很简单,但令人惊讶的是,很多事情都可能出错。

代码:

code.R

library(knitr)
library(ggplot2)

dir.create(path = "output/")
opts_knit$set(base.dir = "output/")

for(i in 1:nrow(mtcars)) 
  filename <- rownames(mtcars)[i]
  knit(input  = "template.Rnw", output = paste0("output/", filename, ".tex"))
  tools::texi2pdf(paste0("output/", filename, ".tex"), clean = TRUE)
  file.copy(from = paste0(filename, ".pdf"), to = paste0("output/", filename, ".pdf"))
  # file.remove(paste0(filename, ".pdf")) # this will DELETE filename.pdf from the current working directory (should be safe because we just created this file)

template.Rnw

\documentclassarticle
\begindocument
<<>>=
ggplot(mtcars[i,], aes(x = cyl, y = disp) ) + geom_point()
@
\enddocument
我们需要设置base.dir,因为当前工作目录比创建文档的目录高一级。这会导致错误的图形路径:knitr 在figure/ 中生成图,但它们应该在output/figure/ 中。因此,编译将失败。 由于某种原因knit2pdf 无法编译生成的中间 TEX 文件。因此我使用knit 生成一个TEX 文件,然后tools::texi2pdf 将此文件编译为PDF。

注意code.R 中的变量如何对模板文档中的代码可见。这就是为什么i可以在template.Rnw中使用。

【讨论】:

感谢您的帮助。它工作正常,甚至非常简单。您提到文件名不得包含空格。从其他语言我知道这是“唯一”强烈推荐的。我错过了什么吗?你在这里做得非常好。再次感谢您! 不客气!对不起,我错了空格;这不是问题,我相应地编辑了答案。在准备答案时,我在 RStudio 中打开了一个 TEX 文件,并想单击“编译 PDF”。然后 RStudio 声称文件名 must 不包含空格。但显然这不适用于tools::texi2pdf 再次感谢您的努力!

以上是关于如何从单个数据框中创建具有不同内容的多个 PDF?的主要内容,如果未能解决你的问题,请参考以下文章

PDF多页不在android中创建[关闭]

如何在另一个数据库中的多个数据库中创建多个表的单个视图?

Pyspark:如何在不同条件的数据框中创建列

使用循环在 ggplot 中创建具有不同 Y 轴值的多个图

如何从 Python 中不同长度的列表列表中创建数据框?

如何从熊猫数据框中创建一个字典?