我正在寻找一种方法,当有人调用plot()或ggplot()时,自动调用dev.off()将绘图刷新到磁盘。
这可能吗? RStudio看起来自动加载情节,这是如何工作的?
答案 0 :(得分:2)
修改:为ggplot
添加可能的方法。
请注意plot
特别是dev.off()
自动调用plot
的原因是非常常见的 - 在致电{ {1}} - 在调用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,所以我不确定它做了什么不同的事情,但我猜它会以这样的方式拦截图形命令同时显示正在进行的情节&#34;在文件完成之前,而不是实际显示文件(对于位图图形,在图完全完成并且调用dev.off()
之前,根本不能写出文件)。