【问题标题】:How to stop R from creating empty Rplots.pdf file when using ggsave and Rscript使用ggsave和Rscript时如何阻止R创建空的Rplots.pdf文件
【发布时间】:2013-06-25 06:17:19
【问题描述】:

我有一个使用 ggsave 保存一些绘图的 R 脚本。当我从命令行运行脚本时,它不仅保存了我的图,还保存了一个空的 Rplots.pdf 文件。如何防止 R 创建这个不必要的文件?

这是一个重现错误的示例脚本:

#!/usr/bin/env Rscript

# Code that creates unnecessary Rplots.pdf file
library(ggplot2)
my.data <- data.frame(x = 1:10, y = 1:10)
my.plot <- qplot(x, y, data = my.data)
ggsave('example.png', my.plot) 

以下所有运行脚本的方式都会创建不必要的文件:

Rscript script.R
Rscript --vanilla script.R
chmod a+x script.R
./script.R 

此外,当我从交互式会话中获取代码时,会打开一个不必要的空白 R 图形设备窗口。

此外,如果我使用以下更详细的代码代替 ggsave,我不会遇到这些问题:

#!/usr/bin/env Rscript

# Code that does NOT create unnecessary Rplots.pdf file
library(ggplot2)
my.data <- data.frame(x = 1:10, y = 1:10)
my.plot <- qplot(x, y, data = my.data)
png(file = 'example.png')
print(my.plot)
dev.off()

这是我的会话信息(无论是运行 Rscript 还是交互方式都相同):

R version 3.0.1 (2013-05-16)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=C                 LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] methods   stats     graphics  grDevices utils     datasets  base     

other attached packages:
[1] ggplot2_0.9.3.1

loaded via a namespace (and not attached):
 [1] colorspace_1.2-2   dichromat_2.0-0    digest_0.6.3       grid_3.0.1        
 [5] gtable_0.1.2       labeling_0.1       MASS_7.3-26        munsell_0.4       
 [9] plyr_1.8           proto_0.3-10       RColorBrewer_1.0-5 reshape2_1.2.2    
[13] scales_0.2.3       stringr_0.6.2   

5 年后更新 (2018-08-02):这个问题来来去去。 ggplot2 2.2.1 不会产生空文件,ggplot2 3.0.0 会产生,而 ggplot2 团队目前正在努力解决这个问题。有关开发历史,请参阅 ggplot2 问题 #1326#2363#2758#2787

【问题讨论】:

  • 如果我在 ggsave 中指定高度和宽度,它似乎可以解决您的问题,但我承认我不立即知道为什么......如果我不得不猜测这是因为默认值是在测量它们之前需要存在的“当前绘图窗口”的尺寸。
  • 我运行了ggsave,它没有创建RPlots.pdf,只有example.pdfggsavedebug 模式下相对简单,你可以试试看device 调用的是什么函数。
  • 我确实看到了这种行为,并且指定 height 和 width 参数似乎可以在交互式会话和使用 RScript 中解决它。
  • 我可以确认这一点。 @joran,也许这值得一个错误报告?
  • @Roland 我想先征求一些意见,看看是否有人认为这种行为是可取的。 不喜欢它,但对我来说,没有人会喜欢它并不明显。

标签: r ggplot2


【解决方案1】:

如果您查看ggsave 中宽度和高度参数的默认值,您会发现它们是par("din")[1]par("din")[2]。如果您在控制台中运行它,您会看到它会打开一个图形窗口(如果尚未打开)。

这是有道理的,因为为了获得以英寸为单位的设备宽度/高度,您需要一个实际的设备。我想有人可能会争辩说,如果没有设备打开,par("din") 应该返回一个错误,在这种情况下,Hadley 肯定会以不同的方式编写ggsave

确实,来自?par

如果当前设备是空设备,par会打开一个新设备 在查询/设置参数之前。

因此,指定宽度/高度将防止虚假设备打开。

【讨论】:

  • 谢谢,@joran!指定高度和宽度以避免par('din') 调用确实可以解决问题。
  • 这对我不起作用(R 3.0.2;ggplot 0.9.3.1);除了我用filename 指定的png(或pdf)文件之外,我仍然得到Rplots.pdf。可能跟device参数有关?
  • @knowah 不确定;该解决方案在 R 3.1.0 和 ggplot2 1.0.0 上仍然适用于我(我刚刚使用问题中的确切代码再次对其进行了测试。)
  • 这个解决方案对我不起作用(R 3.1.0,ggplot2 1.0.0)。我将尺寸作为参数添加到 R 模块中的所有 ggsave() 调用(PDF 和 SVG),但仍在生成文件 Rplots.pdf。我认为它以前可能有效,但我最近升级了我的服务器......
【解决方案2】:

另一种解决方案是使用包R.devices来抑制ggsave打开的图形设备:

library(R.devices)
suppressGraphics(ggsave('example.png', my.plot))

请参阅包作者的tweet 以获取另一个示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    相关资源
    最近更新 更多