我有许多 R 脚本,我想使用 UNIX 风格的管道将它们链接在一起。每个脚本都会将一个数据框作为输入,并提供一个数据框作为输出。例如,我想象这样的东西可以在 R 的批处理模式下运行。
cat raw-input.Rds | step1.R | step2.R | step3.R | step4.R > result.Rds
关于如何做到这一点有什么想法吗?
最佳答案
编写可执行脚本并不是难事,棘手的是如何使脚本从文件和/或管道中读取。我在这里写了一个有点通用的函数:https://stackoverflow.com/a/15785789/1201032
这是一个 I/O 采用 csv 文件形式的示例:
您的 step?.R
文件应如下所示:
#!/usr/bin/Rscript
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")
}
}
args <- commandArgs(TRUE)
file <- args[1]
fh.in <- OpenRead(file)
df.in <- read.csv(fh.in)
close(fh.in)
# do something
df.out <- df.in
# print output
write.csv(df.out, file = stdout(), row.names = FALSE, quote = FALSE)
您的 csv 输入文件应如下所示:
col1,col2
a,1
b,2
现在这应该可以工作了:
cat in.csv | ./step1.R - | ./step2.R -
-
很烦人,但很有必要。还要确保运行类似 chmod +x ./step?.R
的命令来使您的脚本可执行。最后,您可以将它们(没有扩展名)存储在您添加到 PATH 的目录中,这样您就可以像这样运行它:
cat in.csv | step1 - | step2 -
关于R - 通过管道连接脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17952654/