【问题标题】:How to read input from the terminal using /dev/stdin and read.csv()?如何使用 /dev/stdin 和 read.csv() 从终端读取输入?
【发布时间】:2013-05-11 04:11:12
【问题描述】:

我正在使用:

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

我尝试使用read.csv 直接从终端输入一点 CSV 数据 sn-p + 标头。

我遇到的问题可能与 R skips lines from /dev/stdinread.csv, header on first line, skip second line 相关,但差异足够大(那里的答案没有解释我在此处看到的内容)需要单独提出一个问题。

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,所以我在输入前加上一些空行。开始输入之前的 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
  a b
1 1 2
2 3 4

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

问题:

  • 为什么第一个示例没有按预期工作?
  • 为什么需要 5 个空白行或空格(甚至 4 个都不够)才能使其工作?
  • 有没有更好的方法可以直接从终端读取简短的 csv sn-p? (我知道 scanreadLines,但我的数据已经是 csv 格式,所以我想让它尽可能简单地读取/解析/分配)

【问题讨论】:

  • 我认为您发布的第一个链接中的答案实际上可能适用。 R 似乎在/dev/stdin 上创建了一个 4 字节缓冲区。此外,如评论中所述,您可以改用stdin,它似乎工作正常。 (虽然我还是不明白为什么你必须按两次 Ctrl+D)。
  • 谢谢@nograpes!你能用一个有效的例子写一个简短的答案吗?我很乐意接受。第一个链接显示一个 4 KB 的缓冲区正在被“吃掉”,而在这种情况下只需要 5 个字节,所以这似乎是两个不同的问题。另外:这个例子更加简约,因此可能更有用。

标签: linux r input stdin


【解决方案1】:

我认为您发布的第一个链接中的答案实际上可能适用。 R 似乎在 /dev/stdin 上创建了一个 4 字节缓冲区。此外,正如评论中提到的,您可以改用标准输入,它似乎工作正常。 (虽然我还是不明白为什么你必须按两次 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

【讨论】:

  • 非常感谢。此解决方法有效。我只是想知道'stdin' 的行为是否与'/dev/stdin' 不同不是R io 子系统中的错误。我从未见过使用其他程序的 /dev/stdin' 行为不端行。所需的双 CTRL-D 也让我有点担心。
  • @arielf 是的,我怀疑同样的事情......但是 R 开发人员在报告 base 中的错误时非常敏感。因此,您最好确保在报告此问题之前已经完成了研究。
猜你喜欢
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多