我使用:如何使用/ 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/stdin和read.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片段? (我知道
scan
和readLines
,但我的數據是CSV格式了,所以我希望把它作爲簡單的讀/解析/分配越好)
我認爲您發佈的第一個鏈接中的答案實際上可能適用。 R似乎在'/ dev/stdin'上創建了一個4字節的緩衝區。另外,正如評論中所提到的,你可以使用'stdin'來代替,而且它看起來工作正常。 (雖然我仍然不明白爲什麼你必須按Ctrl + D兩次)。 – nograpes 2013-05-11 05:28:57
謝謝@nograpes!你能用一個有效的例子寫一個簡短的答案嗎?我會很樂意接受它。第一個鏈接顯示一個4 KB的緩衝區正在被「吃掉」,而在這種情況下只需要5個字節,所以看起來這是兩個不同的問題。另外:這個例子更簡約,所以可能更有用。 – arielf 2013-05-11 16:09:42