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