在for循环中打印为PDF

在for循环中打印为PDF,r,pdf,loops,for-loop,pdf-generation,R,Pdf,Loops,For Loop,Pdf Generation,我想在绘图上循环,并将绘图结果放入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() } 包含“c:/”的文件名在您的操作系统上是有效的文件名吗?这看起来像是在调用pdf之前要设置的工作目录的一部分。我收到一

我想在绘图上循环,并将绘图结果放入
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()
}

包含“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()
}

要在设备上绘制晶格图,需要打印通过调用其中一个晶格图形函数生成的对象。通常,在交互使用中,如果未指定对象,R将自动打印对象。但是,在循环中,自动打印不起作用,因此必须安排要打印的对象,通常是将其包装在
print()

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


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

这在Linux上对我很有效。(无论如何,当在该系统上使用正确的路径时)。您给出的示例是否真的是您正在做的事情,或者您正在使用不同的绘图系统?晶格还是ggplot2?如果是,则需要将绘图调用包装在
print()
中,因为自动打印在循环中关闭,并且需要打印lattice或ggplot对象以使它们绘制某些内容。是的,它们在lattice中,但此调用也不起作用……有错误吗?我的意思是,正如@Chase在他的回答中提到的,路径在您的系统上有效吗?如果您在工作目录中有写权限,那么直接保存到工作目录,然后删除路径,如@Chase所示。它以前工作过,当我没有使用循环时,我可以在我的C:/path上生成pdf。之前是什么?您已经向我们展示了一些您声称不起作用的代码,但没有告诉我们错误是什么。如果有什么问题的话,代码实际上与实际问题不符(在循环中绘制晶格图形)。将此分解为简单的步骤。您能否在
“C:/plot_1.pdf”
(Windows上的
C
是否需要大写?)?如果可以,尝试循环,但不使用
pdf()
dev.off()
位,然后查看是否可以生成三个晶格图。最后,如果这两种方法都有效,就把它们放在一起。请参阅我的答案,了解您应该能够为Lattice运行的代码。
setwd()
,例如:
setwd(“d:/my.dir”)
@Sir Ksilem-要找到当前工作目录的位置,请使用
getwd()
。要导航到其他目录,请使用
setwd('c:/path/To/new/directory')
。我相信
setwd()
可以处理绝对目录和相对目录,但这可能取决于操作系统。帮助页面应该有更多的细节。这是一个特殊情况(因为原始海报给了我们可能不是他们试图运行的真正代码,所以有点难以理解)
require(lattice)
for(i in 1:3) {
    pdf(paste("plot", i, ".pdf", sep = ""))
    print(xyplot(iris[,1] ~ iris[,i], data = iris))
    dev.off()
}