如何等待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