我已经看过一些让我感到困惑的事情,我只发现了这个: Do some programs not accept process substitution for input files?
这部分有帮助,但我真的很想了解完整的故事。 我注意到当我使用进程替换时,我的一些R脚本会给出不同的(即错误的)结果。
我试图用测试用例来确定问题:
这个脚本:
#!/usr/bin/Rscript
args <- commandArgs(TRUE)
file <-args[1]
cat(file)
cat("\n")
data <- read.table(file, header=F)
cat(mean(data$V1))
cat("\n")
以这种方式生成输入文件:
$ for i in `seq 1 10`; do echo $i >> p; done
$ for i in `seq 1 500`; do cat p >> test; done
引导我:
$ ./mean.R test
test
5.5
$ ./mean.R <(cat test)
/dev/fd/63
5.501476
进一步的测试显示有些线路丢失了...但我想了解原因。 read.table(scan给出相同的结果)是否使用seek?
聚苯乙烯。 使用较小的测试文件(100)报告错误:
$./mean.R <(cat test3)
/dev/fd/63
Error in read.table(file, header = F) : no lines available in input
Execution halted
添加#1:使用经过修改的脚本使用扫描结果是相同的。
答案 0 :(得分:9)
我已经编写了这个通用函数,用于在我自己的脚本中打开文件连接:
OpenRead <- function(arg) {
if (arg %in% c("-", "/dev/stdin")) {
file("stdin", open = "r")
} else if (grepl("^/dev/fd/", arg)) {
fifo(arg, open = "r")
} else {
file(arg, open = "r")
}
}
在您的代码中,将file
替换为file <- OpenRead(file)
,它应该处理以下所有内容:
./mean.R test
./mean.R <(cat test)
cat test | ./mean.R -
cat test | ./foo.R /dev/stdin