如何使用/ dev / stdin和read.csv()从terminal读取input?

我在用着:

R version 3.0.0 (2013-04-03) -- "Masked Marvel" Platform: x86_64-pc-linux-gnu (64-bit) 

我尝试使用read.csv直接从terminalinput一个小的CSV数据片段+标题。

我遇到了一个问题,可能与R /从/ dev / stdin和read.csv,在第一行标题跳过线,跳过第二行,但不同的足够(答案不解释我在这里看到)需要一个单独的问题。

R似乎跳过标题行,并将第二个(数据)行作为标题:

 R> d <- read.csv(file='/dev/stdin', header=TRUE) a,b 1,2 3,4 # hit CTRL-D twice here to end the input # (this is also unexpected: # when reading a few lines interactively in bash, one CTRL-D suffices. # Why is doing it twice necessary in R?) R> d X1 X2 1 3 4 R> colnames(d) [1] "X1" "X2" 

我发现一个解决方法:因为默认情况下read.csvblank.lines.skip = TRUE ,我在input前加一些空行。 在开始input之前有5个空行,似乎是达到预期的最低要求。 顺便说一句:有5个空格的单行同样适用,暗示需要5个字节(或更多)的空白填充:

 R> d <- read.csv(file='/dev/stdin', header=TRUE) a,b 1,2 3,4 # Enter CTRL-D twice here to mark the end of terminal input R> d ab 1 1 2 2 3 4 R> colnames(d) [1] "a" "b" 

问题:

  • 为什么不是第一个例子按预期工作?
  • 为什么需要5个空白行或空格(甚至4个是不够的)来使其工作?
  • 有没有更好的方式直接从terminal读取一个简短的CSV代码段? (我知道scanreadLines ,但我的数据已经在csv格式,所以我想尽可能简单地阅读/parsing/分配)

我认为您发布的第一个链接中的答案实际上可能适用。 R似乎在/ dev / stdin上创建了一个4字节的缓冲区。 另外,正如在评论中提到的,你可以使用stdin来代替,而且看起来工作正常。 (虽然我仍然不明白为什么你必须按Ctrl + D两次)。

 d <- read.csv(file='stdin', header=TRUE) a,b 1,2 3,4 # Hit Control+D twice. > d ab 1 1 2 2 3 4