如何等待R中的按键?

时间:2013-03-07 13:50:43

标签: r keypress wait readline readkey

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

我该怎么做?

6 个答案:

答案 0 :(得分:93)

正如有人已在评论中写道,您不必在readline()之前使用该猫。只需写下:

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

如果您不想将其分配给变量并且不希望在控制台中打印退货,请将readline()包裹在invisible()中:

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

答案 1 :(得分:74)

方法1

等待直到您在控制台中按[enter]:

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

包装成一个函数:

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

此函数与C#中的Console.ReadKey()最相同。

方法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。适用于带有Revolution R v6.1的Windows 7 x64。在RStudio下不起作用(因为它不使用win.graph)。

enter image description here

答案 2 :(得分:17)

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

它不会返回按下哪个键(但可以修改它)。

答案 3 :(得分:11)

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

答案 4 :(得分:0)

此答案与Simon的答案类似,但是除了换行符外,不需要其他输入。

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

使用nlines=1代替n=1,用户只需按Enter即可继续执行Rscript。

答案 5 :(得分:0)

一种做到这一点的方法(有点,你必须按下按钮而不是按键,但是要足够接近)是使用闪亮的。

library(shiny)

ui     <- fluidPage(actionButton("button", "Press the button"))
server <- function(input, output) {observeEvent(input$button, {stopApp()})}

runApp(shinyApp(ui = ui, server = server))

print("He waited for you to press the button in order to print this")

以我的经验,它具有一个独特的特征:即使您运行的脚本中的代码是按照runApp函数编写的,但直到您按下应用程序中的按钮(该按钮停止使用stopApp从内部访问应用。)