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

时间:2014-10-02 01:01:30

标签: 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以适应这种情况?

2 个答案:

答案 0 :(得分:2)

我们构建littler以通过其r可执行文件来支持它。

看看它的例子,它可能适合你的账单。

答案 1 :(得分:2)

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

对于更复杂的用法,命令行参数和选项解析的两个流行包是getoptoptparse。我一直使用它们,他们完成了工作。我还看到argparseargparserGetoptLong,但之前从未使用过它们。我错过了一个:Dirk建议您查看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