我正在寻找一种在有人调用 plot() 或 ggplot() 时自动调用 dev.off() 将绘图刷新到磁盘的方法。
这可能吗?RStudio 看起来会自动加载绘图,它是如何工作的?
编辑:为 . 添加可能的方法ggplot
。
请注意,特别是不会自动调用的原因是,在调用finalize之前添加额外的材料(注释、补充绘图功能、标题、图例等)是非常常见的。输出。plot
dev.off()
plot
dev.off()
但是,如果您真的想plot
最终确定情节并防止添加任何进一步的内容,您可以通过重新定义来做到这一点plot
:
plot <- function(...) {
graphics::plot(...)
dev.off()
}
请注意,对于基于窗口的图形设备(例如x11
),由于dev.off()
关闭了窗口,绘图将在屏幕上短暂闪烁,然后消失,但它应该适用于文件:
> png("plot.png")
> plot(1:10,runif(10))
null device <-- proof that dev.off() was called
1
>
对于ggplot2
,我想你最好的选择是覆盖该print
方法(这是通常在屏幕上显示图的方式)。所以,如果你定义:
print.ggplot <- function(...) {
ggplot2:::print.ggplot(...)
dev.off()
}
然后:
> png("plot.png")
> ggplot(mapping=aes(x=1:10,y=1:10))+geom_line()
[[ print method is implicitly called here ]]
> dev.off() # to prove that dev.off() was already called
Error in dev.off() : cannel shut down device 1 (the null device)
>
似乎以您想要的方式工作。
我不使用 RStudio,所以我不确定它有什么不同,但我猜测它以这样一种方式截取图形命令,即在文件完成之前同时显示“正在进行的绘图” ,而不是实际显示文件(对于位图图形,在绘图完全完成并被dev.off()
调用之前,根本无法写出文件)。