繁体   English   中英

如何在使用ggsave和Rscript时阻止R创建空的Rplots.pdf文件

[英]How to stop R from creating empty Rplots.pdf file when using ggsave and Rscript

我有一个R脚本,使用ggsave保存一些图。 当我从命令行运行脚本时,它不仅保存我的图,而且还保存一个空的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 width和height参数的默认值,你会发现它们是par("din")[1]par("din")[2] 如果您在控制台中运行它,您将看到它打开一个图形窗口,如果尚未打开。

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

确实,来自?par

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

因此,指定宽度/高度将防止伪装置打开。

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

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

有关其他示例,请参阅包作者的推文

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM