如何使R脚本从pipe道和用户给定的参数input

我有以下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

对于更复杂的用法,用于命令行参数和选项解析的两个常用软件包是getopt和optparse 。 我一直使用它们,他们完成了工作。 我也看到了argparse , argparser和GetoptLong,但从未使用过。 我错过了一个: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 

我们通过它的可执行文件来构建小文件来支持它。

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