2014-11-24 8 views
5

Ich versuche, meinen Code fragen Sie mich für einen "TRUE" oder "FALSE" Wert, bevor Sie fortfahren.Lesezeile warten auf Eingabe in R

Es funktioniert derzeit gut, wenn ich es Zeile für Zeile ausführen, aber wenn ich den gesamten Code auf einmal in RStudio ausgeführt wird, geht es ohne Warten auf Benutzereingaben und zeichnet einen Wert von "" für meinen Parameter auf.

raw <- readline("TRUE or FALSE -- this is a validation run: ") 


if (raw == "F" | raw == "FALSE" | raw == "False"){ 
validation <- F 
} else{ 
    validation <- T 
} 
rm(raw) 

Idealerweise würde ich gern eine Antwort, die funktioniert unabhängig davon, wie ich es laufen - RScript, source innerhalb RStudio, oder es läuft (das heißt den Code markieren und die Taste run oder ctrl-Eingabe).

+0

Wie "Sie den Code auf einmal ausführen". Einfügen in das Terminal? Verwenden von Rscript.exe? –

+0

@ MatthewPlourde in RStudio. Ausführen/Sourcing entweder der gesamten Datei oder eines Teils der Datei, die diese enthält. –

+0

könnte man alle Möglichkeiten von f/F/false/False/FALSCH/fasle/etc mit 'if (toupper (unlist (strsplit (roh, '')) [1]) == 'F')' – rawr

Antwort

11

Wenn Sie dies im interaktiven Modus tun möchten, dann haben Sie bereits Antworten, aber nicht für die Verwendung mit Rscript. Aus diesem Beispiel müssen Sie Nachrichten an die Konsole mit cat senden:

Wenn dieser Test Datei mit dem Namen ‚prompt.r‘ und ist in dem Verzeichnis, in dem Sie in einer Systemkonsole Arbeitssitzung:

cat("a string please: "); 
a <- readLines("stdin",n=1); 
cat("You entered") 
str(a); 
cat("\n") 

dann können Sie es von der Kommandozeile als

$ Rscript prompt.r 

laufen Wenn Sie einen Universal-Skript wollen, dann würde dies das Skript unter interaktiven Bedingungen und mein Skript für nicht-interaktiv diejenigen laufen:

if (interactive()){raw <- 
      readline("TRUE or FALSE -- this is a validation run: ") 

       if (raw == "F" | raw == "FALSE" | raw == "False"){ 
       validation <- F 
       } else{ 
        validation <- T 
         } 
      rm(raw) } else{ 
# non-interactive 
cat("a string please: "); 
a <- readLines("stdin",n=1); 
cat("You entered") 
str(a); 
cat("\n")} 
+0

Gibt es eine bessere Möglichkeit, den interaktiven Modus und den Skriptmodus zu kombinieren? – jtianling

+0

Eine Antwort auf eine Anforderung nach einer "besseren" Lösung erfordert eine Art von Softwaremetrik, die derzeit nicht ausgedrückt wird. –

+0

Wissen Sie nicht, was Sie meinen, zumindest in Python und Ruby, müssen Sie nicht die beiden Wege trennen. – jtianling

8

Führen Sie den Code aus, indem Sie die Zeilen markieren und auf Ausführen klicken? Wenn ja, könnte das Ihr Problem sein, weil R Zeile für Zeile Ihren Code im Terminal eingibt.

Schreiben Sie stattdessen Ihr Skript (oder geben Sie die Teile aus, die Sie nicht testen) und klicken Sie auf die Schaltfläche für die Quelle. Dann wartet R auf die Benutzerantwort, anstatt die Zeile nach readline() in readline() einzugeben.

Ich hatte das gleiche Problem wie Sie, die mich aufgefordert, nach einer Antwort zu suchen. Aber dann habe ich diese andere Art der Ausführung des Codes ausprobiert und es hat funktioniert.

+0

Das löste mein Problem tatsächlich, solange der ursprüngliche Code stammt, scheint readLines() zu stoppen und auf Benutzereingaben zu warten. –