Как дождаться нажатия клавиши в R?



Я хочу приостановить свой сценарий R, пока пользователь не нажмет клавишу.



Как мне это сделать?

585   5  

5 ответов:

как кто-то уже написал в комментарии, Вам не нужно использовать кошку раньше readline(). Просто напишите:

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

если вы не хотите назначать его переменной и не хотите, чтобы возврат печатался в консоли, оберните readline() на invisible():

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

Способ 1

ждет, пока вы нажмете [enter] в консоли:

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

здесь вы можете увидеть график, с половиной его точек окрашены, ожидая следующего нажатия клавиши на клавиатуре.

совместимость: протестировано под среды используют либо выиграть.граф или X11. Работает с Windows 7 x64 с революцией R v6.1. Не работает под RStudio (так как он не использует win.диаграмма.)

enter image description here

вот небольшая функция (с помощью пакета 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 (который, я думаю, все общие), будет реагировать на любое нажатие клавиши (не только enter), и даже работает, когда скрипт запускается в пакетном режиме (но он все еще приостанавливается в пакетном режиме, поэтому, если вас там нет, чтобы продолжить его, он будет ждать вечно). Таймер может быть добавлен, чтобы сделать его продолжить после установленного количества времени, если не нажата или нажата клавиша.

он не возвращает, какая клавиша была нажата (но может быть изменена для этого).

R и Rscript оба отправляют '' для отладки и сканирования в неинтерактивном режиме (см. ? readline). Решение состоит в том, чтобы заставить stdin С помощью сканирования.

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

пример:

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

этот ответ похож на Симон ' s, но не требует дополнительного ввода, кроме новой строки.

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

используя nlines=1 вместо n=1, пользователь может просто нажать enter, чтобы продолжить Rscript.

Comments

    Ничего не найдено.