如何等待R中的按键?
我想暂停我的R脚本,直到用户按下一个键。
我如何做到这一点?
正如有人已经写了评论,你不必在readline()
之前使用猫。 简单地写:
readline(prompt="Press [enter] to continue")
如果您不想将其分配给variables并且不希望返回打印在控制台中,请将readline()
包装在invisible()
:
invisible(readline(prompt="Press [enter] to continue"))
方法1
等待,直到按下控制台中的[enter]
cat ("Press [enter] to continue") line <- readline()
包装成function:
readkey <- function() { cat ("Press [enter] to continue") line <- readline() }
这个函数是C#中Console.ReadKey()
的最好的等价物。
方法2
暂停直到您在键盘上键入[enter]按键。 这种方法的缺点是,如果你键入的东西不是一个数字,它会显示一个错误。
print ("Press [enter] to continue") number <- scan(n=1)
包装成function:
readkey <- function() { cat("[press [enter] to continue]") number <- scan(n=1) }
方法3
想象一下,在绘制图表上的另一点之前,您想等待按键。 在这种情况下,我们可以使用getGraphicsEvent()等待graphics内的按键。
这个示例程序演示了这个概念:
readkeygraph <- function(prompt) { getGraphicsEvent(prompt = prompt, onMouseDown = NULL, onMouseMove = NULL, onMouseUp = NULL, onKeybd = onKeybd, consolePrompt = "[click on graph then follow top prompt to continue]") Sys.sleep(0.01) return(keyPressed) } onKeybd <- function(key) { keyPressed <<- key } xaxis=c(1:10) # Set up the x-axis. yaxis=runif(10,min=0,max=1) # Set up the y-axis. plot(xaxis,yaxis) for (i in xaxis) { # On each keypress, color the points on the graph in red, one by one. points(i,yaxis[i],col="red", pch=19) keyPressed = readkeygraph("[press any key to continue]") }
在这里,你可以看到图中的一半点着色,等待键盘上的下一个按键。
兼容性:在环境下testing使用win.graph或X11 。 使用Revolution R v6.1与Windows 7 x64一起使用。 不能在RStudio下工作(因为它不使用win.graph)。
这里有一个小函数(使用tcltk包),它将打开一个小窗口,并等待直到你点击继续button或按任意键(而小窗口仍然有焦点),然后它会让你的脚本继续。
library(tcltk) mywait <- function() { tt <- tktoplevel() tkpack( tkbutton(tt, text='Continue', command=function()tkdestroy(tt)), side='bottom') tkbind(tt,'<Key>', function()tkdestroy(tt) ) tkwait.window(tt) }
只要把mywait()
放到你想让脚本暂停的任何地方。
这可以在任何支持tcltk的平台上运行(我认为它们都是常用的),会响应任何按键(而不仅仅是input),甚至在脚本以批处理模式运行时也可以工作(但是它仍然以批处理方式暂停,所以如果你不在那里继续它将永远等待)。 如果不点击或按下一个键,可以添加一个定时器,使其在一段时间后继续。
它不会返回哪个键被按下(但可以修改这样做)。
R和Rscript都以非交互模式发送''
到readline并扫描(see ? readline
)。 解决的办法是强制使用扫描的stdin
。
cat('Solution to everything? > ') b <- scan("stdin", character(), n=1)
例:
$ Rscript tR Solution to everything? > 42 Read 1 item