2013-03-07 18 views

risposta

65

Come qualcuno ha già scritto in un commento, non è necessario utilizzare il gatto prima dello readline(). Basta scrivere:

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

Se non si desidera assegnare ad una variabile e non vogliono un ritorno stampata nella console, avvolgere il readline() in un invisible():

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

Penso che questa sia la migliore risposta qui. –

68

Metodo 1

attende che si prema [ENTER] nella console:

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

Wrapping in una funzione:

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

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

Metodo 2

Pausa fino a quando si digita la sequenza di tasti [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) 

Wrapping in una funzione:

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

Metodo 3

Immaginate 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 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 potete vedere il grafico, con la metà dei suoi punti colorati, in attesa della prossima sequenza di tasti 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 (dato che non usa win.graph).

enter image description here

+5

Il metodo 1 potrebbe essere abbreviato usando l'argomento 'prompt' su' readline'. Il metodo 2 funzionerebbe con qualsiasi input (non solo numeri) se 'what =" "' sono stati aggiunti alla chiamata a 'scan'. 'getGraphicsEvent' funziona solo su dispositivi grafici specifici su determinate piattaforme (ma se si utilizza uno di questi dispositivi funziona correttamente). –

+2

'readline' e' scan' non funzionano in riga di comando sotto Linux –

+2

Se si utilizza questa funzione (Metodo 1) in un ciclo e si desidera interrompere il ciclo, includere ad esempio: 'if (riga ==" Q ") stop()' –

17

Qui è un po 'la funzione (utilizzando il pacchetto tcltk) che aprirà una piccola finestra e aspettare finché non si clicca sul pulsante di continuare oppure premere un tasto qualsiasi (mentre la piccola finestra ha ancora al centro) , quindi lascerà che il tuo script continui.

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() nello script da nessuna parte che si desidera lo script per mettere in pausa.

Questo funziona su qualsiasi piattaforma che supporta tcltk (che penso sia tutti i comuni), risponderà a qualsiasi pressione dei tasti (non solo entra), e funziona anche quando lo script viene eseguito in modalità batch (ma è ancora fa una pausa 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 viene premuto o premuto un tasto.

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

+0

È fantastico. Ma solo un avvertimento, non funzionerà su RStudio-server webclient, per qualche ragione ('Errore nella struttura (.External (.C_dotTclObjv, objv), class =" tclObj "): [tcl] nome comando non valido" toplevel ".') – milia

+1

@milia, è corretto. Il codice basato su tcltk deve essere eseguito sul computer locale e non verrà eseguito su RStudio-Server. –

11

R e Rscript inviano entrambi '' per la lettura e la scansione in modalità non interattiva (vedere ? readline). La soluzione è forzare stdin utilizzando la scansione.

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

Esempio:

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

Fantastico! Questo quasi risolve [il mio problema] (https://stackoverflow.com/questions/47294283/how-to-run-an-r-script-and-show-a-plot). Ancora sarebbe bello se la console non fosse in attesa di testo + Return, ma piuttosto reagito al primo keypress (come in "Premi qualsiasi tasto per continuare"). – Vorac

Problemi correlati