是否可以通过以下方式将图以png
格式自动保存到文件夹中?
png
都会创建一个新的plot.new()
文件points()
,lines()
,rect()
时),以便每当图形更新时,文件也会更新(不更新)必须通过dev.off()
关闭设备)如果可能的话,以下代码应按预期工作:
plot(rnorm(100))
# create a new png file (e.g. plot-1.png) and the graphics is output to the file
plot(rnorm(100))
# create a new png file (e.g. plot-2.png) and the graphics is output to the file
abline(h = 0, col = "red")
# then the line is output to the file
这样做的动机是试图避免X11 / Quartz转发(它们在屏幕/ tmux上不能很好地工作,因为当用户从其他地方附加会话时图形会丢失),并避免xpra
似乎很少有人支持它(导致Ubuntu 16.04卡在登录屏幕上,请参阅https://askubuntu.com/questions/930161/ubuntu-16-04-2-cannot-login-after-installing-xpra?noredirect=1#comment1661998_930161)。
这与RStudio Server处理R图形的方式非常相似(请参见https://github.com/rstudio/rstudio/tree/master/src/cpp/r/session/graphics的源代码)。我想知道是否有更简单的方法来实现这一点(最好不要从头开始重写图形设备)?
答案 0 :(得分:4)
尽管github页面包含更多信息,我将快速总结如何使用rmote
。
ssh -L 4321:localhost:4321 remoteuser@remotehost
tmux
(如果已经启动,则为tmux attach
)emacs
,使用ESS启动R 一旦开始,就开始:
library(rmote)
start_rmote(server_dir="path/to/save/pngs")
进行一些绘图,将本地Web浏览器指向http://127.0.0.1:4321
。 (最初它会显示一个目录列表,但是一旦开始绘制,它将自动刷新。)
plot(1:10, type='l')
plot_done() # required for base-graphics
plot(2:20)
plot_done()
library(ggplot2)
ggplot(mtcars, aes(mpg, disp)) + geom_point() # no plot_done() required for ggplot2
断开与tmux / ssh的连接。 (由于关闭了隧道,网页可能会失败。)
ssh -L 4321:localhost:4321 remoteuser@remotehost
和tmux attach
。stop_rmote()
。所有图都保存在path/to/save/pngs/plots/
中。奖金:如果您对同一目录执行start_rmote(...)
,则可以使用相同的绘图历史记录。因此,如果必须重新启动R会话,则不会丢失任何内容。 (我还没有测试过,但是也许可以同时使用R会话...)
编辑:
我经常更改图的大小,部分是为了填充浏览器的屏幕,但有时会设置报告的特定文件大小或复制不同的屏幕限制。
options(rmote_device = list(type="png", retina=TRUE, width=1024, height=768))
参考:https://github.com/cloudyr/rmote/blob/ee13936806cc1be5b2f95b70b33af374331ae2dc/man/rmote_device.Rd
编辑2 :我想我应该注意,尽管可能未充分利用rmote
的功能,但可以将 just 用于使用大多数绘图方法自动生成PNG的目的。您无需连接127.0.0.1:4321即可实现自动保存PNG的好处。