2014-12-10 18 views
11

Come posso offrire all'utente 5 secondi per scrivere qualcosa per chiedere una pausa di durata indefinita. Se la pausa non viene richiesta entro questi 5 secondi, il processo continua. Se viene richiesta una pausa, l'utente ha tutto il tempo (s) di cui ha bisogno e (s) può premere "invio" per riprendere il processo ogni volta che desidera.R: Offri 5 secondi per richiedere una pausa. Se non è richiesta alcuna pausa, riprendere il processo

L'interesse di tale funzionalità è che se l'utente è assente, la pausa dura solo per 5 secondi. E se l'utente è presente, allora (s) può godersi una pausa per guardare il grafico che è stato prodotto ad esempio.

Il codice può eventualmente sembrare che:

DoYouWantaPause = function(){ 
    myprompt = "You have 5 seconds to write the letter <p>. If you don't the process will go on." 

    foo = readline(prompt = myprompt, killAfter = 5 Seconds) # give 5 seconds to the user. If the user enter a letter, then this letter is stored in `foo`. 

    if (foo == "p" | foo == "P") { # if the user has typed "p" or "P" 
     foo = readline(prompt = "Press enter when you want to resume the process") # Offer a pause of indefinite length 
    } 
} 

# Main 
for (i in somelist){ 
    ... 
    DoYouWantaPause() 
} 
+1

# 1 motivo per leggere i documenti prima di provare nuove cose: '? R.utils :: withTimeout: Inoltre, non è possibile interrompere/interrompere un prompt" readline "(ad esempio readline() e readLines()) utilizzando i timeout; l'eccezione di timeout non verrà lanciata fino a quando l'utente non completa il prompt (ad esempio dopo aver premuto ENTER). ' – rawr

+0

Sì, sapevo che non aveva senso, ma era utile spiegare le mie esigenze. Grazie per la copia dei documenti. –

risposta

10

qui è un po funzione quick sulla base dei pacchetti TclTk e tcltk2:

library(tcltk) 
library(tcltk2) 

mywait <- function() { 
    tt <- tktoplevel() 
    tmp <- tclAfter(5000, function()tkdestroy(tt)) 
    tkpack(tkbutton(tt, text='Pause', command=function()tclAfterCancel(tmp))) 
    tkpack(tkbutton(tt, text='Continue', command=function()tkdestroy(tt)), 
     side='bottom') 
    tkbind(tt,'<Key>', function()tkdestroy(tt)) 

    tkwait.window(tt) 
    invisible() 
} 

Run mywait e una piccola finestra pop-up con 2 pulsanti, se non si fa nulla, dopo circa 5 secondi la finestra andrà via e mywait ritornerà permettendo a R di continuare. Se fai clic su "Continua" in qualsiasi momento, verrà restituito immediatamente. Se fai clic su "Pausa", il conto alla rovescia si interromperà e attenderà che tu faccia clic su continua (o premendo un tasto) prima di continuare.

Questa è un'estensione della risposta data here.

+1

Dolce! Funziona perfettamente. Molte grazie! –