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