2014-12-10 2 views
11

Wie kann ich dem Benutzer 5 Sekunden anbieten, um etwas zu schreiben, um nach einer unbestimmten Pause zu fragen. Wenn die Pause innerhalb dieser 5 Sekunden nicht angefordert wird, wird der Prozess fortgesetzt. Wenn eine Pause verlangt wird, hat der Benutzer alle Zeit (en), die er braucht, und er kann "Enter" drücken, um den Prozess fortzusetzen, wann immer er will.R: Bieten Sie 5 Sekunden an, um eine Pause zu fordern. Wenn keine Pause erforderlich ist, setzen Sie den Prozess fort

Das Interesse einer solchen Funktionalität ist, dass, wenn der Benutzer abwesend ist, die Pause nur für 5 Sekunden dauert. Und wenn der Benutzer anwesend ist, kann er/sie eine Pause genießen, um beispielsweise den erzeugten Graph zu sehen.

Der Code kann schließlich so aussehen:

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 Grund, die Dokumente zu lesen, bevor Sie neue Dinge ausprobieren: '? R.utils :: withTimeout: Außerdem ist es nicht möglich, eine" readline "-Prompt zu unterbrechen/ausbrechen (zB readline() und readLines()) Timeouts verwenden; Die Zeitüberschreitungsausnahme wird erst ausgelöst, nachdem der Benutzer die Eingabeaufforderung abgeschlossen hat (d. h. nach dem Drücken der EINGABETASTE). " – rawr

+0

Ja, ich wusste, dass das keinen Sinn ergab, aber es war hilfreich, meine Bedürfnisse zu erklären. Danke für die Kopie der Dokumente. –

Antwort

10

Hier ist eine kurze kleine Funktion auf der Grundlage der tcltk und tcltk2 Pakete:

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 und ein kleines Fenster wird Pop-up mit 2 Tasten, wenn Sie nichts tun, dann nach etwa 5 Sekunden wird das Fenster verschwinden und mywait wird zurückkehren, so dass R weitermachen. Wenn Sie zu einem beliebigen Zeitpunkt auf "Weiter" klicken, wird es sofort zurückkehren. Wenn Sie auf "Pause" klicken, stoppt der Countdown und Sie warten auf das Klicken auf "Weiter" (oder das Drücken einer Taste), bevor Sie fortfahren.

Dies ist eine Erweiterung der Antwort gegeben here.

+1

Süß! Das funktioniert perfekt. Danke vielmals! –