【发布时间】: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.pdf。ggsave在debug模式下相对简单,你可以试试看device调用的是什么函数。 -
我确实看到了这种行为,并且指定 height 和 width 参数似乎可以在交互式会话和使用 RScript 中解决它。
-
我可以确认这一点。 @joran,也许这值得一个错误报告?
-
@Roland 我想先征求一些意见,看看是否有人认为这种行为是可取的。 我不喜欢它,但对我来说,没有人会喜欢它并不明显。