Daniel Standage
Daniel Standage

Reputation: 8314

read.table function and stdin

I have a tab-delimited text file that I am trying to load into R with the read.table function. The first few lines of the script look like this

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

This works. I had originally tried to get R to read the data from standard input, but was unsuccessful. My first approach...

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

...didn't seem to work at all. My second approach...

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

...read the data file but (for some reason I don't understand) the first 20 or so lines get mangled, which is a big problem (especially since those lines contain the header information). Is there any way to get read.table to read from standard input? Am I missing something completely obvious?

Upvotes: 6

Views: 6120

Answers (1)

Konrad Rudolph
Konrad Rudolph

Reputation: 545963

?stdin says:

stdin() refers to the ‘console’ and not to the C-level ‘stdin’ of the process. The distinction matters in GUI consoles (which may not have an active ‘stdin’, and if they do it may not be connected to console input), and also in embedded applications. If you want access to the C-level file stream ‘stdin’, use file("stdin").

And:

When R is reading a script from a file, the file is the ‘console’: this is traditional usage to allow in-line data …

That’s the probable reason for the observed behaviour. In principle you can read.table from standard input – but in most (almost all?) cases you’ll want to do this via file('stdin').

Upvotes: 10

Related Questions