如何等待R中一个按键?(How to wait for a keypress in R?)

2019-07-21 03:43发布

我想,直到用户按下一个键暂停我的[R脚本。

我该怎么做呢?

Answer 1:

正如有人评论已经写,你不必之前,使用猫readline() 简单地写:

readline(prompt="Press [enter] to continue")

如果你不想把它分配给一个变量,不希望打印到控制台上一回,包裹readline()invisible()

invisible(readline(prompt="Press [enter] to continue"))


Answer 2:

方法1

等待,直到你按下控制台[进入]:

cat ("Press [enter] to continue")
line <- readline()

包装成一个函数:

readkey <- function()
{
    cat ("Press [enter] to continue")
    line <- readline()
}

此功能是最好相当于Console.ReadKey()在C#。

方法2

暂停,直到您键入键盘上的[Enter]键击。 这种方法的缺点是,如果你输入的东西是不是一个数字,它会显示一个错误。

print ("Press [enter] to continue")
number <- scan(n=1)

包装成一个函数:

readkey <- function()
{
    cat("[press [enter] to continue]")
    number <- scan(n=1)
}

方法3

假如你想在图形上绘制另一点之前等待一个按键。 在这种情况下,我们可以使用getGraphicsEvent()等待图表内的按键。

此示例程序说明了这一概念:

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]")
}

在这里,您可以看到图中,其点颜色的一半,等待键盘上的一个按键。

兼容性:在环境测试请使用win.graph或X11 。 适用于Windows 7 64位与转速R V6.1。 RStudio下不工作(因为它不使用win.graph)。



Answer 3:

这里是一个小功能(使用tcltk包),将打开一个小窗口,等待,直到您点击继续按钮或按任意键(而小窗口仍具有焦点),然后它会让你的脚本继续。

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(我认为这是所有常见的),在任何平台上,将任何按键(不只是进入)响应,即使脚本在批处理模式下运行工作(但它仍然在批处理模式下暂停,所以如果你是不是有继续它,它会永远等待)。 可以添加一个计时器,使其继续在设定的时间量之后,如果不点击或有任何按键。

它不返回哪个键被按下(但可以修改这样做)。



Answer 4:

R和RSCRIPT同时发送''的ReadLine和非交互模式(见扫描? readline )。 解决的办法是强制stdin使用扫描。

cat('Solution to everything? > ')
b <- scan("stdin", character(), n=1)

例:

$ Rscript t.R 
Solution to everything? > 42
Read 1 item


Answer 5:

这个答案是相似的西蒙的,但并不需要比一个换行符以外的额外投入。

cat("Press Enter to continue...")
invisible(scan("stdin", character(), nlines = 1, quiet = TRUE))

使用nlines=1而不是n=1时,用户只需按下Enter继续RSCRIPT。



文章来源: How to wait for a keypress in R?