【问题标题】:How to use Knitr to produce pdfs using for loop?如何使用 Knitr 使用 for 循环生成 pdf?
【发布时间】:2017-08-23 03:07:22
【问题描述】:

我编写了一个 R 脚本来从 csv 文件中读取数据,并使用以下代码将这些数据打印到不同的 Word Doc (docx) 文件中。这按预期工作,没有任何故障。但我不知道要实现的是使用“knitr”或“sweave”来输出 pdf 文件。有人可以指导我如何使脚本输出 pdf 文件而不是 docx 吗?

library(ggplot2)
library(reshape)
lff <- list.files(path = "./data/", pattern = paste('*.csv*',sep=""), 
 full.names = TRUE, recursive = TRUE, include.dirs = TRUE) 
for (i in 1:length(lff)) {
....

  writeDoc( doc, filename )
}

【问题讨论】:

  • 您应该提供一个可复制的示例,而不是将 ... 放入您的循环中。这样可以更轻松地为您提供帮助。

标签: r latex knitr


【解决方案1】:

您可以使用 gridExtra 包:

library(gridExtra)
library(stringr)

lff <- list.files(path = "./data/", pattern = paste('*.csv*',sep=""), 
                  full.names = TRUE, recursive = TRUE, include.dirs = TRUE) 

for (i in lff) {
  dt <- read.csv(i, header=TRUE)
  pdf(paste0(str_replace(i, '.csv', ''),'.pdf'), height=11, width=8.5)
  grid.table(dt)
  dev.off()
}

【讨论】:

    【解决方案2】:

    这是一个带有 Sweave 的 knitr 的解决方案,因为你需要循环一些东西,比如 i,在此基础上你的 Script.Rnw 会产生不同的结果,其他明智的循环将是无用的。请参阅下面的代码:

    ## elements in `names` could also be parameters in your `Script.Rnw`
    names<-c('first','second','third')
    for (i in names) {
      output.name<-paste0(i,'.tex')
      knit2pdf('Script.Rnw',output = output.name)
    } 
    

    最后你会得到 'first.pdf','second.pdf','third.pdf' 对于 shiva 而言,名称中的元素可能是她的 csv 文件的名称。根据@giac_man 的评论,您可以在.Rnw 文件中编写如何读取您的csv 文件,因为它们是csv,我猜您也可以在.Rnw 文件中使用xtable 来打印您的csv 文件并且还需要 LateX 来获取这些 PDF,我目前正在使用 MikTex。

    【讨论】:

    • 我认为这不能回答问题。您假设@shiva 有 Script.Rnw 文件,但她的输入是 csv 文件。
    猜你喜欢
    • 2021-01-14
    • 1970-01-01
    • 2017-08-16
    • 2012-01-21
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    相关资源
    最近更新 更多