Come aspettare una pressione di un tasto in R?

Voglio mettere in pausa il mio script R finché l’utente non preme un tasto.

Come faccio a fare questo?

Come qualcuno ha già scritto in un commento, non è necessario utilizzare il gatto prima di readline() . Scrivi semplicemente:

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

Se non si desidera assegnarlo a una variabile e non si desidera che venga restituito un risultato stampato nella console, avvolgere la readline() in un object invisible() :

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

Metodo 1

Aspetta fino a quando non premi [invio] nella console:

 cat ("Press [enter] to continue") line < - readline() 

Avvolgere in una funzione:

 readkey < - function() { cat ("Press [enter] to continue") line <- readline() } 

Questa funzione è l'equivalente migliore di Console.ReadKey() in C #.

Metodo 2

Metti in pausa fino a quando digiti [invio] tasto 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) 

Avvolgere in una funzione:

 readkey < - function() { cat("[press [enter] to continue]") number <- scan(n=1) } 

Metodo 3

Immagina di voler attendere 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 esempio di programma 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 metà dei suoi punti colorati, in attesa del prossimo tasto sulla tastiera.

Compatibilità: testato in ambienti, utilizza win.graph o X11 . Funziona con Windows 7 x64 con Revolution R v6.1. Non funziona con RStudio (dato che non usa win.graph).

inserisci la descrizione dell'immagine qui

Ecco una piccola funzione (usando il pacchetto tcltk) che aprirà una piccola finestra e attenderà fino a quando non clicchi sul pulsante continua o premi un tasto qualsiasi (mentre la piccola finestra ha ancora il focus), quindi lascerà il tuo script continuare.

 library(tcltk) mywait < - function() { tt <- tktoplevel() tkpack( tkbutton(tt, text='Continue', command=function()tkdestroy(tt)), side='bottom') tkbind(tt,'', function()tkdestroy(tt) ) tkwait.window(tt) } 

Basta mettere mywait() nel tuo script ovunque tu voglia che lo script si interrompa.

Funziona su qualsiasi piattaforma che supporti tcltk (che penso sia comune), risponderà a qualsiasi pressione dei tasti (non solo entra), 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). È ansible aggiungere un timer per farlo continuare dopo un determinato periodo di tempo, se non viene premuto o premuto un tasto.

Non restituisce quale tasto è stato premuto (ma potrebbe essere modificato per farlo).

R e Rscript inviano entrambi '' a readline e scan in modalità non intertriggers (vedi ? readline ). La soluzione è forzare lo stdin usando la scansione.

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

Esempio:

 $ Rscript tR Solution to everything? > 42 Read 1 item 

Questa risposta è simile a quella di Simon , ma non richiede input extra oltre a un ritorno a capo.

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

Usando nlines=1 invece di n=1 , l’utente può semplicemente premere Invio per continuare con Rscript.