如何防止生成Rplots.pdf文件?

27

我正在使用一些R代码生成一些png文件,但是在工作目录中仍然会生成一个Rplots.pdf文件,有没有办法防止这种情况发生?

library(Cairo)
CairoPNG(file = "graphs.png")
nf <- layout(matrix(c(1:8), 2, 4, byrow=T), c(1, 1), c(1, 1, 1, 1), TRUE)
for (k in 1:num.k) {
    plotMatrix(connect.matrix.ordered[k,,], log = F, main = paste("k=", k.vector[k]), sub = paste("Cophenetic coef.=", rho[k]), ylab = "samples", xlab ="samples")
}
y.range <- c(1 - 2*(1 - min(rho)), 1)
plot(k.vector, rho, main ="Cophenetic Coefficient", xlim=c(k.init, k.final), ylim=y.range, xlab = "k", ylab="Cophenetic correlation", type = "n")
lines(k.vector, rho, type = "l", col = "black")
points(k.vector, rho, pch=22, type = "p", cex = 1.25, bg = "black", col = "black")
dev.off()

你是不是想说 Rplots.png?我不明白 @Andrie 的回答如何阻止创建 PDF 设备,但如果你实际上是指 Rplots.png,我可以看到这是一个解决方案。 - Gavin Simpson
@Gavin Simpson - 关闭,现在正在生成一个名为Rplot001.png的文件,而且没有被清除。 - rjzii
我无法重现你的问题(部分原因是你的示例不是自包含的)。像以下这样简单的东西是否也会产生这个问题? library(Cairo); CairoPNG(file = "graphs.png"); layout(matrix(c(1:4), 2)); for (k in 1:4) plot(1,k); dev.off() - Aaron left Stack Overflow
@Aaron - 我自己也不确定。这段代码大部分都没有文档说明,而且还有很多与绘制图表相关的代码,我们现在甚至都用不到了。我可能需要再次更新问题,一旦我清理掉更多的代码。 - rjzii
听起来很有可能是有一些代码在未先打开文件的情况下打开了设备,就像我的答案中所述。 - Aaron left Stack Overflow
4个回答

37

我知道这是一个非常旧的帖子,肯定原帖作者已经解决了。但我在使用plotly时遇到了类似的情况。将ggplot输出转换为plotly输出时,出现了无法打开文件“Rplots.pdf”的相似错误。

我通过简单地包含以下内容来解决它:

pdf(NULL)
我不确定错误的原因,一直没有找到答案,但是这个小小的代码解决了问题,现在我的plotly和ggplot组合能够正常显示了。

1
很好的提示,@Syamanthaka。这个问题困扰了我很长时间。但是我发现,虽然在批处理模式下运行R时pdf(NULL)可以防止创建Rplots.pdf文件,但如果在任何图形被显示之前运行pdf(NULL),它也会抑制RStudio中的绘图窗口显示。您可以通过在可能在批处理或交互式运行的程序顶部使用if(!interactive()) pdf(NULL)来避免RStudio的问题。 - user3799203
根据base::options文档,看起来环境变量R_INTERACTIVE_DEVICE和R_DEFAULT_DEVICE也可以用来解决这个问题。 - user3799203

15

我想知道您是否有在代码片段之前或之后打开设备的其他命令。完成后,运行 dev.cur() 查看是否还有未关闭的设备。如果没有,则应返回null设备。

以下是重新创建获取Rplots.pdfRplot001.png的方法; 如果未打开设备,则layoutpar命令将打开设备,并且由于未给定文件名,因此使用默认文件名。

options(device="pdf")
layout(1:4)
dev.off()

options(device="png")
par()
dev.off()
也许在这里看到这种情况会给你一些启示,帮助你理解你的代码发生了什么。

1
这最终成为了问题 - 一个图表在没有为其打开文件的情况下被生成。尽管代码位置非常难以理解。 - rjzii

2

这是CairoPNG的源代码:

function (filename = "Rplot%03d.png", width = 480, height = 480, 
    pointsize = 12, bg = "white", res = NA, ...) 
{
    Cairo(width, height, type = "png", file = filename, pointsize = pointsize, 
        bg = bg, ...)
}

这段文字告诉你,CairoPNG 接受 filename=... 作为参数,并将其作为 file 参数传递给 Cairo
我能理解这可能会引起混淆,但重点是你对 CairoPNG 的调用应该是:
CairoPNG(filename="graphs.png")

看看是否有效...


这在很大程度上解决了问题,但似乎还需要 options(device = "png") 才能正确运行。 - rjzii
进行了更多的检查,当 options(device = "png") 打开时,会生成一个 Rplot001.png 文件,同样地,如果关闭,则会生成 Rplots.pdf。有什么想法可能是怎么回事吗?Rplot001.png 文件中确实包含来自聚合报告的有效数据。 - rjzii
抱歉,我从未使用过Cairo。 :-( - Andrie

1
我最近升级到R-3.0.3后遇到了类似的问题(是的,我们有点落后了!)。原来palette("default")现在会打开一个设备,但以前不会。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接