2013-03-07 3 views

ответ

65

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

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

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

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

Я думаю, что это лучший ответ здесь. –

68

Метод 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 x64 с Revolution R v6.1. Не работает в RStudio (поскольку он не использует win.graph).

enter image description here

+5

Метод 1 можно сократить, используя аргумент 'prompt' для' readline'. Метод 2 будет работать с любым вводом (а не только с числами), если '' '' '' '' '' 'были добавлены в вызов' scan'. 'getGraphicsEvent' работает только на определенных графических устройствах на определенных платформах (но если вы используете одно из этих устройств, он отлично работает). –

+2

'readline' и' scan' не работают в командной строке под Linux –

+2

Если вы используете эту функцию (метод 1) в цикле и хотите остановить цикл, включите, например: 'if (line ==" Q ") stop()' –

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

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

+0

Это потрясающе. Но просто предупреждение, оно не будет работать на веб-клиенте RStudio-Server по какой-либо причине («Ошибка в структуре (.External (.C_dotTclObjv, objv), class =« tclObj »): [tcl] недопустимое имя команды" toplevel ".') – milia

+1

@milia, это правильно. Код, основанный на tcltk, должен запускаться на локальном компьютере и не запускаться на RStudio-Server. –

11

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

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

Пример:

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

Удивительный! Это почти решает [моя проблема] (https://stackoverflow.com/questions/47294283/how-to-run-an-r-script-and-show-a-plot). Тем не менее было бы неплохо, если консоль не ждала текста + Return, а скорее реагировала на первое нажатие клавиши (как в «Нажмите любую клавишу, чтобы продолжить»). – Vorac

Смежные вопросы