我有以下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
我们通过它的可执行文件来构建小文件来支持它。
看看它的例子,它可能适合你的账单。