我正在尝试为每一行生成.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的过程。任何帮助将不胜感激。
答案 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