为每一行生成pdf文档

时间:2017-09-01 20:09:59

标签: r

我正在尝试为每一行生成.pdf文档,然后按行名存储pdf文档。以下是示例数据:

canada <- c(100, 80, 100, 100, 20)
korea <- c(100, 80, 100, 26, 65)
brazil <- c(100, 90, 100, 30, 30)
fruit <- rbind(canada, korea, brazil)
colnames(fruit) <- c("apple", "orange", "banana", "grape", "kiwi")
fruit

price <- function(val){

  val <- tolower(val)
  myrow <- fruit[val,]
  nation <- tools::toTitleCase(val)
  score.min <- c(myrow)[which.min(c(myrow))]

  cat(paste0("In ", nation, " cheapest fruit costs ", score.min, " cents."))

}

因此,对于输出,我最终会得到三个pdf文档:加拿大,韩国和巴西。并且,每个pdf文档都包含一个句子,&#34;在 nation 中,最便宜的水果费 x 美分。&#34;

到目前为止,我尝试过rmarkdown,但我无法找到一种方法来自动化按行名创建新pdf的过程。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

我必须删除price

来稍微修改cat
price <- function(val){

  val <- tolower(val)
  myrow <- fruit[val,]
  nation <- tools::toTitleCase(val)
  score.min <- c(myrow)[which.min(c(myrow))]

  paste0("In ", nation, " cheapest fruit costs ", score.min, " cents.")

}

library(rmarkdown)

for (x in rownames(fruit)) {
  rmdfile = paste0(x,".Rmd")
  cat(price(x), file=rmdfile)
  render(input = rmdfile, output_format = "pdf_document")
}

答案 1 :(得分:1)

使用pdf图形驱动程序绘制单行。 price以下是问题中定义的。不会生成任何中间文件,也不会使用任何包。对于一个文本页面来说这应该没问题,因为你的问题只涉及每个文件一行。

write_lines_pdf <- function(x, file = "pdffile", ...) {
    if (!grepl("\\.pdf$", file)) file <- paste0(file, ".pdf") # append .pdf if not present
    pdf(file)
    plot.new()
    text(x = 0, y = 1, labels = paste(x, collapse = "\n"), adj = c(0, 1), ...)   
    dev.off()
}

for(nm in rownames(fruit)) write_lines_pdf(capture.output(price(nm)), nm)

另一个使用内置向量month.name的示例:

write_lines_pdf(month.name)

或者考虑使用gplots::textplot代替plot.new(); text(...)

使用适当的参数

如果输入字符串从页面一侧流出,请尝试strwrap将文本换行到以下行,或使用cex图形参数使文本变小。如果x是输入文本,那么:

write_lines_pdf(strwrap(x, 50)) # wrap at column 50

write_lines_pdf(x, cex = 0.7) # make text smaller