read.table函数和标准输入(stdin)

6

我有一个制表符分隔的文本文件,想要使用read.table函数将其加载到R中。脚本的前几行如下:

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

这是可行的。我最初尝试让R从标准输入读取数据,但未成功。我的第一个尝试...

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

...似乎完全没有起作用。 我的第二种方法...

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

我需要读取数据文件,但是(由于某些我不理解的原因),前20行左右会被破坏,这是一个大问题(特别是因为这些行包含头部信息)。有没有办法让read.table从标准输入中读取?我是否漏掉了什么非常明显的东西?

1个回答

10

?stdin提示:

stdin()指的是“控制台”,而不是进程级别的C语言‘stdin’。这个区别在GUI控制台(可能没有活动的‘stdin’,或者如果有的话可能没有连接到控制台输入),以及嵌入式应用程序中很重要。 如果您想访问C语言级别的文件流“stdin”,请使用file("stdin")

并且:

当R从文件中读取脚本时,文件就是“控制台”:这是允许行内数据的传统用法...

这可能是观察到的行为原因。原则上你可以从标准输入中使用read.table - 但在大多数(几乎所有?)情况下,您将希望通过file('stdin')来执行此操作。


太棒了。使用file("stdin")而不是stdin()或"/dev/stdin"就解决了问题。 - Daniel Standage
九年过去了,read.table(file("stdin")) 仍然是个好用的技巧。 - Christopher Bottoms

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接