在R中绘图后自动调用dev.off

时间:2017-05-28 22:12:08

标签: r rlang

我正在寻找一种方法,当有人调用plot()或ggplot()时,自动调用dev.off()将绘图刷新到磁盘。

这可能吗? RStudio看起来自动加载情节,这是如何工作的?

1 个答案:

答案 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()之前,根本不能写出文件)。