让R(统计包)在bash脚本中运行时等待键盘提示



我使用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

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

使用

readLines("stdin", n = 1)

这将得到真正的stdin,而不是stdin()使用的。

我将调用它:

Rscript myfile.r

这是一个迟来的答案,但我的目标是相似的:Rscript执行应该带来一个带有情节的rgl窗口,而不是其他的,它应该留在那里,直到窗口关闭,即rgl窗口不应该终止。

为了实现这一点,我简单地将其放在R脚本的末尾,并且rgl绘图将保留在那里供操作,直到您退出窗口,消耗很少的CPU时间:

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

对于常规的2D R图,locator()的工作原理类似,或者locator(1),如果一键关闭绘图窗口。

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

quartz() # or maybe windows() in windows
for (i in 1:5) {plot(i, i); locator(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)

plot.lm使用devAskNewPage(TRUE);

最新更新