使用R脚本生成图表

33

我有一个小的shell脚本(bash),它运行一个R脚本,并产生一个图形输出。一切都很好,但是在绘制出图形之后,R会立即退出。是否有办法让R会话保持活动状态,直到图形窗口关闭。

这是Shell脚本。

#!/bin/bash
R --slave --vanilla < myscript.r

还有R脚本。

daq = read.table(file('mydata.dat'))
X11()
pairs(daq)
//R Completes this and then exits immediately.

提前感谢任何帮助!

5个回答

33
如果您使用Rscript命令(这更适合此目的),则可以像这样运行它:
#!/usr/bin/Rscript

daq = read.table(file('mydata.dat'))
X11()
pairs(daq)

message("Press Return To Continue")
invisible(readLines("stdin", n=1))

请确保设置了myscript.r文件的执行权限,然后像这样运行:

/path/to/myscript.r

或者没有shebang:

Rscript /path/to/myscript.r

4
这不太好,因为OP希望脚本在绘图关闭后终止,而不是在按下键后终止。 - mbq
这个已经足够好用了,我只需要让显示保持足够长的时间,以便在 shell 脚本完成后可以查看绘图。 - Stephen Diehl
3
对我来说这不起作用,在Windows上从未出现过图表... - Matthew Lueder
这不会刷新窗口,因此您也无法调整大小。 - csl
以上方法对于常规的plot()调用完美运行。尝试使用此方法打开带有leaflet地图的图形窗口,图形窗口会打开,但地图不会呈现。有什么想法吗? - msoderstrom

18

您可以添加一个循环,每n秒检查一次图形设备:

while (!is.null(dev.list())) Sys.sleep(1)

这将会一直休眠,直到你关闭绘图窗口。


这样做好多了,甚至允许用户调整窗口大小等等。 - csl
这个代码可以正常运行,但是我有点困惑。x11()设备不应该先关闭,然后才能运行循环吗?我哪里理解错了吗? - user2338823
这个循环在设备运行时运行。每秒钟它都会检查设备是否仍然打开,如果是,则再次休眠1秒钟。结果是脚本将一直停留在循环中,直到您手动关闭图形设备(此时,dev.list()变为NULL并退出循环)。 - Alex Deckmyn

3
一种解决方案是将绘图输出为PDF格式:
pdf(file="myplot.pdf")

##your plot command here
plot( . . . )

dev.off()

类似的解决方案已经在这里提供:(https://dev59.com/EFgQ5IYBdhLWcg3wlk7P#42545005),可以输出图片。这是一个不错的解决方法。 - Foad S. Farimani

3

这不是一个完美的解决方案,但您可以在绘图命令之后立即调用locator()
或者将图形保存为pdf文件,然后使用system调用pdf查看器。


-2
更重要的问题是,为什么你想在图形创建后运行 R?可以在交互模式或批处理模式下使用它...我不明白你想要实现什么。此外,尝试使用 littler,它位于 Ubuntu 存储库中(如果我没记错的话,是 universe 存储库),或者使用 Rscript,将脚本重写并将其命名为 myscript.r,并确保在第一行中放置正确的路径。尝试使用 whereis Rscript(通常为 /usr/bin/Rscript)。忘掉 bash 脚本吧。你可以向 Rscript 传递 --vanilla 和 --slave 参数,但我不知道有什么用... O_o


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接