2017-12-22 5 views
4

Entschuldigung, aber die Terminologie, die ich im Titel verwende, wird möglicherweise nicht korrekt verwendet. Wenn ich versuche, diesen Code auszuführen, scheint es so zu sein, als würde er es ausführen, aber den Befehl nie abschließen. Wenn ich auf das Stop-Befehlszeichen (rot) klicke, macht es nichts. Ich kann nicht aus R schließen. Also warum dauert das ewig?Mein Versuch, eine "Verbindung" zu verwenden, während ich versuche, Eingaben einzulesen, bewirkt, dass R einfriert oder abstürzt

con <- file('stdin', open = 'r') 

inputs <- readLines(con) 
+1

Versuchen 'readlines (stdin())' –

+1

könnte dies in Beziehung gesetzt werden: https://stackoverflow.com/questions/30191232/use-stdin-from-within-r-studio – InfiniteFlashChess

+0

@RADO, ich Ich werde das Kopfgeld der Antwort geben, die du akzeptierst. – InfiniteFlashChess

Antwort

5

Wenn in RStudio arbeiten, müssen Sie readLines(stdin()) verwenden, anstatt readLines(file('stdin')), wenn Sie entweder, wenn läuft R im Terminal verwenden können.

Es gibt jedoch auch ein Problem, die Anzahl der Zeilen der Eingabe nicht anzugeben, da Sie RStudio verwenden. Beim Lesen der Eingabe von stdin, Strg + D signalisiert das Ende des Eingangs. Wenn Sie dies jedoch nicht in Terminal Ctrl+D is unavailable, sondern in RStudio tun, können Sie ohne Eingabe der Eingabezeilen das Ablesen von stdin nicht beenden.

Also, wenn Sie R vom Terminal ausgeführt werden, wird Ihr Code funktioniert, und Sie signalisieren das Ende der Eingabe über Ctrl +D. Wenn Sie von RStudio aus arbeiten müssen, können Sie immer noch readLines(stdin())if you know the number of lines of input; z.B.

> readLines(stdin(), n=2) 
Hello 
World 
[1] "Hello" "World" 

Eine alternative Abhilfe ist scan() zu verwenden, z.B .:

> scan(,'') 
1: Hello 
2: World 
3: 
Read 2 items 
[1] "Hello" "World" 

(In der dritten Zeile nur gedrückt I Eingabe beenden Enter). Der Vorteil ist, dass Sie die Anzahl der Zeilen nicht vorher wissen müssen.

1

RStudio hat eine etwas indirekte Verbindung zu R (mindestens 4 years ago es stdin nach nirgendwo umgeleitet). Es ist wahrscheinlich für unsere Zwecke eingebettet. Dies ist wahrscheinlich ein Teil davon, warum stdin() funktionieren kann, wenn es mit readLines gepaart wird (Es wird eine Terminalverbindung statt einer Dateiverbindung erstellt). @ Duckmayr die scan() Lösung ist recht schön und dokumentiert ist die Art der Sache zu sein, die in dieser Situation funktioniert ...

der Name einer Datei aus Datenwerte zu lesen. Wenn die spezifizierte Datei "" ist, dann wird die Eingabe von der Tastatur genommen (oder was auch immer stdin() liest , wenn die Eingabe umgeleitet wird oder R eingebettet ist).

Falls Sie eine leere Eingabe ‚okay‘, können Sie auch Schleifen zu betracht über die Daten aus einer einzigen Zeile mit einigem Sentinel-Wert bekommen, das heißt, was die Schleife Stopp macht (hier ‚EOF‘).

input <- function() { 
    entry <- '' 
    while (!any(entry == "EOF")) { 
    entry <- c(readline(), entry) 
    } 
    return(entry[-1]) 
} 
Verwandte Themen