Как ждать нажатия клавиши в R?
Я хочу приостановить мой сценарий R, пока пользователь не нажмет клавишу.
Как мне это сделать?
7 ответов
Как кто-то уже написал в комментарии, вам не нужно использовать кошку раньше 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]")
}
Здесь вы можете увидеть график с половиной цветных точек, ожидающих следующего нажатия клавиши на клавиатуре.
Совместимость: протестировано в средах с использованием win.graph или X11. Работает с Windows 7 x64 с Revolution R v6.1. Не работает под RStudio (так как не использует win.graph).
Вот небольшая функция (с использованием пакета 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 (которая, я думаю, является наиболее распространенной), будет реагировать на любое нажатие клавиши (не только ввод), и даже работает, когда скрипт запускается в пакетном режиме (но он все равно останавливается в пакетном режиме). так что, если вы не там, чтобы продолжить это будет ждать вечно). Можно добавить таймер, чтобы он продолжался через заданный промежуток времени, если не нажать или не нажать клавишу.
Он не возвращает, какая клавиша была нажата (но может быть изменена для этого).
R и Rscript оба отправляют ''
читать и сканировать в неинтерактивном режиме (см. ? readline
). Решение состоит в том, чтобы заставить stdin
используя сканирование.
cat('Solution to everything? > ')
b <- scan("stdin", character(), n=1)
Пример:
$ Rscript t.R
Solution to everything? > 42
Read 1 item
Этот ответ аналогичен ответу Саймона, но не требует дополнительного ввода, кроме новой строки.
cat("Press Enter to continue...")
invisible(scan("stdin", character(), nlines = 1, quiet = TRUE))
С помощью nlines=1
вместо n=1
пользователь может просто нажать Enter, чтобы продолжить Rscript.
Функция
keypress()
из пакетаkeypress
мгновенно считывает одно нажатие клавиши, не нажимая Enter.
Однако он работает только в терминале Unix/OSX или в командной строке Windows. Он не работает в Rstudio, графическом интерфейсе Windows R, буфере оболочки emacs и т. д.
Один из способов сделать это (вроде как, вам нужно нажимать кнопку, а не клавишу, но достаточно близко) - использовать shiny:
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
).