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

Automatically calling dev.off after plot in R

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

这可能吗? RStudio 看起来会自动加载绘图,它是如何工作的?

编辑:ggplot 添加可能的方法。

请注意 原因 plot,尤其是不会自动调用 dev.off() 的原因是它很常见——在调用 plot -- 在调用 dev.off() 最终确定输出之前通过额外的调用添加额外的 material(注释、补充绘图功能、标题、图例等)。

但是,如果您真的想要plot完成情节并防止添加任何进一步的内容,您可以通过重新定义plot来完成:

plot <- function(...) {
    graphics::plot(...)
    dev.off()
}

请注意,对于 window-based 图形设备(例如 x11),绘图会在消失前在屏幕上短暂闪烁,因为 dev.off() 关闭了 window,但它应该适用于文件:

> 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,所以我不确定它有什么不同,但我猜测它会以同时显示 "plot in progress" 的方式拦截图形命令在文件最终确定之前,而不是实际显示文件(对于位图图形,在绘图完全完成并调用 dev.off() 之前根本无法写出)。