R - 通过管道连接脚本

标签 r unix pipe

我有许多 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/

相关文章:

maven - 如何在 Docker 容器中的 JoNaS 上部署应用程序

linux - 为什么两次使用 grep 时没有显示输出?

r - 将 data.table 的列(名称和值)传递给函数

linux - 无法弄清楚如何在 bash 循环中执行算术 (for)

c - indir 系统调用

python多处理管道轮询错误

c - 通过管道填充 execlp 的输出,然后将其打印到控制台

r - 从数据框列表中将选定的数据框添加到一起

linux - 无法在centos上卸载并重新安装R

r - 如何使用Sparklyr包对不同数据类型的数据进行扁平化?