Відповіді:
Як уже хтось писав у коментарі, раніше не потрібно використовувати кішку readline()
. Просто напишіть:
readline(prompt="Press [enter] to continue")
Якщо ви не хочете , щоб привласнити його змінної і не хочуть повернення надрукований в консолі, оберніть readline()
в invisible()
:
invisible(readline(prompt="Press [enter] to continue"))
press esc keep to exit loop
?
Спосіб 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).
prompt
аргументу до readline
. Спосіб 2 працював би з будь-яким входом (а не лише цифрами), якби вони what=""
були додані до виклику scan
. getGraphicsEvent
працює лише на певних графічних пристроях на певних платформах (але якщо ви використовуєте один із цих пристроїв, він працює чудово).
if(line == "Q") stop()
Ось невелика функція (за допомогою пакета 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 (що, на мою думку, є загальним), реагуватиме на будь-яке натискання клавіші (не просто вводити) і навіть працює, коли сценарій запускається в пакетному режимі (але він все ще призупиняється в пакетному режимі , тож якщо ви не там, щоб продовжити це, це буде чекати вічно). Можна додати таймер, щоб продовжувати його після встановленого часу, якщо його не натискали або натиснуто клавішу.
Він не повертає, яку клавішу натискали (але її можна змінити для цього).
Error in structure(.External(.C_dotTclObjv, objv), class = "tclObj") : [tcl] invalid command name "toplevel".
)
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.
Rscript
: він призупиняється і вимагає лише натискання, Enter
щоб продовжити.
Спосіб цього (начебто, ви повинні натиснути кнопку, а не клавішу, але досить близько) - використовувати блискучі:
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
).