Risposte:
Come qualcuno ha già scritto in un commento, non è necessario utilizzare prima il gatto readline()
. Scrivi semplicemente:
readline(prompt="Press [enter] to continue")
Se non si desidera assegnarlo a una variabile e non si desidera stampare un ritorno nella console, avvolgere readline()
in un invisible()
:
invisible(readline(prompt="Press [enter] to continue"))
press esc keep to exit loop
?
Metodo 1
Attende finché non si preme [invio] nella console:
cat ("Press [enter] to continue")
line <- readline()
Avvolgimento in una funzione:
readkey <- function()
{
cat ("Press [enter] to continue")
line <- readline()
}
Questa funzione è il miglior equivalente di Console.ReadKey()
in C #.
Metodo 2
Metti in pausa fino a quando non digiti il tasto [invio] sulla tastiera. Lo svantaggio di questo metodo è che se si digita qualcosa che non è un numero, verrà visualizzato un errore.
print ("Press [enter] to continue")
number <- scan(n=1)
Avvolgimento in una funzione:
readkey <- function()
{
cat("[press [enter] to continue]")
number <- scan(n=1)
}
Metodo 3
Immagina di voler aspettare la pressione di un tasto prima di tracciare un altro punto su un grafico. In questo caso, possiamo usare getGraphicsEvent () per attendere la pressione di un tasto all'interno di un grafico.
Questo programma di esempio illustra il concetto:
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]")
}
Qui puoi vedere il grafico, con la metà dei suoi punti colorati, in attesa del prossimo tasto sulla tastiera.
Compatibilità: testato in ambienti utilizzare win.graph o X11 . Funziona con Windows 7 x64 con Revolution R v6.1. Non funziona con RStudio (in quanto non utilizza win.graph).
prompt
argomento a readline
. Il metodo 2 funzionerebbe con qualsiasi input (non solo numeri) se what=""
fosse aggiunto alla chiamata scan
. getGraphicsEvent
Funziona solo su dispositivi grafici specifici su determinate piattaforme (ma se stai usando uno di quei dispositivi funziona benissimo).
if(line == "Q") stop()
Ecco una piccola funzione (usando il pacchetto tcltk) che aprirà una piccola finestra e aspetterà di fare clic sul pulsante continua o premere un tasto qualsiasi (mentre la piccola finestra ha ancora lo stato attivo), quindi farà continuare lo script.
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)
}
Basta mettere mywait()
nel vostro ovunque script che si desidera lo script per mettere in pausa.
Funziona su qualsiasi piattaforma che supporti tcltk (che penso siano tutti quelli comuni), risponderà a qualsiasi pressione dei tasti (non solo invio) e funziona anche quando lo script viene eseguito in modalità batch (ma si ferma ancora in modalità batch , quindi se non sei lì per continuare, aspetterà per sempre). È possibile aggiungere un timer per farlo continuare dopo un determinato periodo di tempo se non si fa clic o si preme un tasto.
Non restituisce quale tasto è stato premuto (ma potrebbe essere modificato per farlo).
Error in structure(.External(.C_dotTclObjv, objv), class = "tclObj") : [tcl] invalid command name "toplevel".
)
R e Rscript inviano entrambi ''
a readline ed eseguono la scansione in modalità non interattiva (vedi ? readline
). La soluzione è forzare l' stdin
utilizzo della scansione.
cat('Solution to everything? > ')
b <- scan("stdin", character(), n=1)
Esempio:
$ Rscript t.R
Solution to everything? > 42
Read 1 item
Questa risposta è simile a quella di Simon , ma non richiede input extra oltre a una nuova riga.
cat("Press Enter to continue...")
invisible(scan("stdin", character(), nlines = 1, quiet = TRUE))
Utilizzando nlines=1
invece di n=1
, l'utente può semplicemente premere Invio per continuare Rscript.
Rscript
: fa una pausa e richiede solo di colpire Enter
per continuare.
Un modo per farlo (un po ', devi premere un pulsante anziché un tasto, ma abbastanza vicino) è usare lucido:
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")
Per la mia esperienza, questo ha una caratteristica unica: anche se hai eseguito uno script con codice scritto seguendo la runApp
funzione, non verrà eseguito fino a quando non avrai premuto il pulsante nell'app (pulsante che interrompe l'utilizzo delle app dall'interno stopApp
).