8

我正在使用 R 在循环中生成一系列图,用户按下回车键表示他们已经看到了图,是时候继续前进了。这些是使用 rgl 包生成的交互式可旋转图,因此使用 Sys.sleep() 之类的东西还不够好。

目前我可以使用 readline() ,它在交互式运行 R 时可以找到。但是,如果我想在 bash 脚本中运行我的 R 脚本,所有的图都会在屏幕前闪烁。无论我使用以下命令调用 R,都会发生这种情况:

R --no-save -f myfile.r
R --no-save -e "source('myfile.r')"
R --no-save << myfile.r

如何让 R 在作为 bash 子进程运行时暂停并等待用户点击?

4

5 回答 5

3

这是一个迟到的答案,但我的目标是相似的:Rscript 执行应该打开一个带有绘图的 rgl 窗口,并且没有其他内容,并且它应该保持在那里直到窗口关闭,即 rgl 窗口不应该终止。

为了实现这一点,我只是将它放在 R 脚本的末尾,并且 rgl 图将保留在那里进行操作,直到您退出窗口,消耗很少的 CPU 时间:

play3d(function(time) {Sys.sleep(0.01); list()} )

对于常规的 2D R 绘图,locator()工作方式类似,或者locator(1)如果单击应关闭绘图窗口。

于 2012-08-15T11:18:55.087 回答
3

用这个:

readLines("stdin", n = 1)

那将得到真实的stdin而不是stdin()使用的东西。

我会调用它:

Rscript myfile.r
于 2011-10-05T01:01:31.117 回答
2

我不确定是否有一种简单的方法可以等待键盘输入,但至少您可以等待鼠标单击
不优雅,但试试这个脚本:

quartz() # or maybe windows() in windows
for (i in 1:5) {plot(i, i); locator(1)}
于 2011-10-05T00:41:33.653 回答
1

这是一个适用于我的示例脚本(在 Windows 上测试了您的第一个调用方法)。它使用 tcltk 包并使用单个按钮创建一个额外的小窗口,脚本将暂停(但仍允许您与 rgl 窗口交互),直到您在该窗口中按下某个键时单击“继续”按钮处于活动状态,然后继续执行脚本。

library(tcltk)
library(rgl)

mywait <- function() {
    tt <- tktoplevel()
    tkpack( tkbutton(tt, text='Continue', command=function()tkdestroy(tt)),
        side='bottom')
    tkbind(tt,'<Key>', function()tkdestroy(tt) )

    tkwait.window(tt)
}


x <- rnorm(10)
y <- rnorm(10)
z <- rnorm(10)

plot3d(x,y,z)

mywait()

x <- rnorm(100)
y <- rnorm(100)
z <- rnorm(100)

plot3d(x,y,z)

mywait()

cor(x,y)
于 2011-10-05T16:08:47.843 回答
0

plot.lm用途devAskNewPage(TRUE);也许这也适用于此。

于 2011-10-05T14:49:55.907 回答