2013-05-11 144 views
2

我使用:如何使用/ dev/stdin和read.csv()從終端讀取輸入?

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

我嘗試使用read.csv輸入一點CSV數據片斷+報頭,直接從終端。

我遇到了一個可能與R skips lines from /dev/stdinread.csv, header on first line, skip second line有關的問題,但它有足夠的不同(這裏的答案沒有解釋我在這裏看到的)以保證有單獨的問題。

ř似乎跳過標題行和治療第二個(數據)線作爲標頭:

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.csv具有blank.lines.skip = TRUE,我前綴輸入一些空行。在開始輸入之前,有5條空行看起來是使其按照預期工作的最低要求。 BTW:有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 
    a b 
1 1 2 
2 3 4 

R> colnames(d) 
[1] "a" "b" 

問題:

  • 爲什麼不是第一個例子作爲工作預期?
  • 爲什麼需要5個空白行或空格(甚至4個不足)才能使其工作?
  • 有沒有更好的方式直接從終端讀取一個簡短的csv片段? (我知道scanreadLines,但我的數據是CSV格式了,所以我希望把它作爲簡單的讀/解析/分配越好)
+0

我認爲您發佈的第一個鏈接中的答案實際上可能適用。 R似乎在'/ dev/stdin'上創建了一個4字節的緩衝區。另外,正如評論中所提到的,你可以使用'stdin'來代替,而且它看起來工作正常。 (雖然我仍然不明白爲什麼你必須按Ctrl + D兩次)。 – nograpes 2013-05-11 05:28:57

+0

謝謝@nograpes!你能用一個有效的例子寫一個簡短的答案嗎?我會很樂意接受它。第一個鏈接顯示一個4 KB的緩衝區正在被「吃掉」,而在這種情況下只需要5個字節,所以看起來這是兩個不同的問題。另外:這個例子更簡約,所以可能更有用。 – arielf 2013-05-11 16:09:42

回答

5

我想答案在第一個鏈接你張貼可能實際上是適用的。 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 
    a b 
1 1 2 
2 3 4 
+0

非常感謝。此解決方法有效。我只是想知道'stdin'的行爲與'/ dev/stdin'不同的行爲不是R io子系統中的錯誤。我從來沒有見過使用其他程序的/ dev/stdin'misbehaving這行。另外所需的雙CTRL-D也讓我擔心。 – arielf 2013-05-14 22:20:14

+0

@arielf是的,我懷疑同樣的事情......但是在報告'base'中的錯誤時,R開發人員非常敏感。所以你最好確保你在報告之前完成了研究。 – nograpes 2013-05-15 17:03:32