linux - 如何使 R 脚本从管道和用户给定的参数中获取输入

标签 linux r bash unix stdin

我有以下 R 脚本 (myscript.r)

#!/usr/bin/env Rscript
dat <- read.table(file('stdin'), sep=" ",header=FALSE)
# do something with dat
# later with user given "param_1" 

使用该脚本,我们可以按以下方式运行它;

$ cat data_no_*.txt | ./myscript.r

我想做的是让脚本从用户那里获取额外的参数:

$ cat data_no_*.txt | ./myscript.r param_1

我应该如何修改 myscript.r 以适应它?

最佳答案

对于非常基本的用法,请查看 ?commandArgs

对于更复杂的用法,两个流行的命令行参数和选项解析包是 getoptoptparse .我一直在使用它们,它们完成了工作。我还看到 argparse , argparser , 和 GetoptLong但以前从未使用过它们。我错过了一个:德克建议你看看docopt这看起来非常好并且易​​于使用。

最后,由于您似乎是通过管道传递参数,您可能会发现这个 OpenRead()函数可用于概括您的代码并允许您的参数是管道或文件。


我想测试 docopt,所以将它们放在一起,您的脚本可能如下所示:

#!/usr/bin/env Rscript

## Command-line parsing ##

'usage: my_prog.R [-v -m <msg>] <param> <file_arg> 

options:
 -v        verbose
 -m <msg>  Message' -> doc

library(docopt)
opts <- docopt(doc)

if (opts$v) print(str(opts)) 
if (!is.null(opts$message)) cat("MESSAGE: ", opts$m)

## File Read ##

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")
   }
}

dat.con <- OpenRead(opts$file_arg)
dat <- read.table(dat.con, sep = " ", header = FALSE)

# do something with dat and opts$param

你可以测试运行:

echo "1 2 3" | ./test.R -v -m HI param_1 -

./test.R -v -m HI param_1 some_file.txt

关于linux - 如何使 R 脚本从管道和用户给定的参数中获取输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26152998/

相关文章:

c++ - 如何以编程方式获取进程使用的内存量?

r - 来自 rjags 的语法错误

linux - 当用户想要关闭它时从 bash 脚本的 STDIN 退出

bash - dc(1) 和前导零

linux - Unix Bash 脚本空文件条件

linux - 有多少行包含字符串 “int” 而不包含 "integer".h 文件?

python - 杀死或停止生菜中的python脚本

r - 为不同权重的组计算R中的一系列加权平均值

linux - 在适用于 Linux 的 Azure 应用服务中运行 .NET Core API 时出现性能问题

r - igraph R中从根到叶的有向 TreeMap 中的所有路径