2013-10-10 16 views
5

Ich habe eine Tab-getrennte Textdatei, die ich versuche, in R mit der read.table Funktion zu laden. Die ersten Zeilen des Skripts sehen so aus:read.table Funktion und stdin

#!/usr/bin/env Rscript 
args <- commandArgs(trailingOnly=TRUE) 
data <- read.table(args[1], header=TRUE, sep="\t", quote="") 
# process the data 

Dies funktioniert. Ich hatte ursprünglich versucht, R zu bekommen, um die Daten von der Standardeingabe zu lesen, war aber nicht erfolgreich. Mein erster Ansatz ...

#!/usr/bin/env Rscript 
data <- read.table(stdin(), header=TRUE, sep="\t", quote="") 
# process the data 

... schien überhaupt nicht zu funktionieren. Mein zweiter Ansatz ...

#!/usr/bin/env Rscript 
data <- read.table("/dev/stdin", header=TRUE, sep="\t", quote="") 
# process the data 

... die Datendatei lesen, aber (aus irgendeinem Grund Ich verstehe nicht) die ersten 20 oder so Linien verstümmelt bekommen, was ein großes Problem ist (vor allem, da diese Leitungen enthält die Kopfinformation). Gibt es eine Möglichkeit, read.table aus dem Standard-Eingang zu lesen? Fehle ich etwas völlig Offensichtliches?

Antwort

9

?stdin sagt:

stdin() auf die ‚Konsole‘ bezieht und nicht auf die C-Ebene ‚stdin‘ des Prozesses. Die Unterscheidung ist wichtig in GUI-Konsolen (die möglicherweise nicht eine aktive 'stdin', und wenn sie es tun, kann nicht an den Konsolen-Eingang angeschlossen), und auch in eingebetteten Anwendungen. Wenn Sie auf den C-Level-Dateistream 'stdin' zugreifen möchten, verwenden Sie file("stdin").

Und:

Wenn R ein Skript aus einer Datei zu lesen, die Datei ist die 'Konsole': Diese traditionelle Nutzung ist in-line-Daten zu ermöglichen ...

Das ist der wahrscheinliche Grund für das beobachtete Verhalten. Im Prinzip Sie kannread.table von Standard-Eingang - aber in den meisten (fast alle?) Fällen möchten Sie dies über file('stdin') tun.

+0

Brilliant. Datei ("stdin") anstelle von stdin() oder "/ dev/stdin" hat den Trick gemacht. –