【问题标题】:Print to PDF in a for loop在 for 循环中打印到 PDF
【发布时间】:2011-08-18 10:34:08
【问题描述】:

我想循环一个情节并将情节的结果放在PDF中。

以下代码用于执行此操作:

这样做是循环 3 次并从 iris 数据集中绘制 3 个不同的图。然后它应该将其保存到C:/ 驱动器。 PDF 文件已创建,但已损坏。

for(i in 1:3){
  pdf(paste("c:/", i, ".pdf", sep=""))
  plot(cbind(iris[1], iris[i]))
  dev.off()
}

【问题讨论】:

  • 这适用于我在 Linux 上。 (无论如何,在该系统上使用正确的路径时)。你给出的例子真的是你在做什么,还是你在使用不同的绘图系统?格子还是ggplot2?如果是,那么您需要将绘图调用包装在 print() 中,因为自动打印在循环中关闭,您需要打印 lattice 或 ggplot 对象以让它们绘制一些东西。
  • 是的,它们在格子中,但是这个也不起作用......
  • 有什么错误吗?我的意思是,正如@Chase 在他的回答中提到的那样,路径在您的系统上有效吗?如果您在那里有写权限,那么只保存到工作目录怎么样,然后只需删除@Chase所示的路径。
  • 它以前工作过,当我不使用循环时,我可以在我的 C:/ 路径上制作 pdf 文件
  • 在什么之前?您向我们展示了一些您声称不起作用的代码,但没有告诉我们错误是什么,代码实际上与真正的问题不对应(在循环中绘制格子图形)。将其分解为简单的步骤。你能在"C:/plot_1.pdf" 创建一个单独的图吗(C 在 Windows 上需要大写吗?)?如果可以,请尝试不使用 pdf() 和 dev.off() 位的循环,看看是否可以生成三个格子图。最后,如果这两个都有效,请将它们放在一起。请参阅我的答案以获取您应该能够为 Lattice 运行的代码。

标签: r pdf loops for-loop pdf-generation


【解决方案1】:

在您的操作系统上,包含“c:/”的文件名是有效的文件名吗?这看起来像是在调用pdf 之前要设置的工作目录的一部分。我收到一条错误消息,告诉我它无法打开该文件:

Error in pdf(paste("c:/", i, ".pdf", sep = "")) : 
  cannot open file 'c:/1.pdf'

如果我从文件名中删除“c:/”位,则可以正确生成三个 PDF。此外,如果您将 dev.off() 移到 for 循环之外,您将获得一个包含三页而不是三个 PDF 的 PDF。可能是也可能不是你想要的......

for(i in 1:3){
  pdf(paste("plot", i,".pdf",sep=""))
  plot(cbind(iris[1],iris[i]))
  dev.off()
}

【讨论】:

  • setwd(),例如:setwd("d:/my.dir")。
  • @Sir Ksilem - 要找出当前工作目录的位置,请使用getwd()。要导航到其他目录,请使用setwd('c:/path/to/new/directory')。我相信setwd() 可以同时使用绝对目录和相对目录,但这可能取决于操作系统。帮助页面应该有更多的细节。
【解决方案2】:

要在设备上绘制点阵图,需要打印通过调用点阵图形函数之一生成的对象。通常,在交互式使用中,如果没有分配,R 会自动打印对象。然而,在循环中,自动打印不起作用,因此必须安排要打印的对象,通常是将其包装在 print() 中。

这是一个例子(请原谅我滥用公式符号;-):

require(lattice)
for(i in 1:3) {
    pdf(paste("plot", i, ".pdf", sep = ""))
    print(xyplot(iris[,1] ~ iris[,i], data = iris))
    dev.off()
}

这会在pdf 设备上生成三个图。

【讨论】:

  • 这是cran.r-project.org/doc/FAQ/… 的一个特例(这有点难以弄清楚,因为原始海报给了我们可能不是他们试图运行的真实代码)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多