Linux 如何使R脚本从管道和用户给定的参数获取输入
我有以下R脚本(Linux 如何使R脚本从管道和用户给定的参数获取输入,linux,r,bash,unix,stdin,Linux,R,Bash,Unix,Stdin,我有以下R脚本(myscript.R) 我要做的是使脚本从用户处获取附加参数: $ cat data_no_*.txt | ./myscript.r param_1 如何修改myscript.r以适应这种情况?我们通过其r可执行文件来支持这一点 看看它的例子,它可能符合你的要求。关于非常基本的用法,请看一下?commandArgs 对于更复杂的用法,两个常用的命令行参数和选项解析包是和。我一直在使用它们,它们完成了任务。我也看到了,但以前从未使用过。我错过了一个:德克建议你看看哪个看起来非常好
myscript.R
)
我要做的是使脚本从用户处获取附加参数:
$ cat data_no_*.txt | ./myscript.r param_1
如何修改myscript.r以适应这种情况?我们通过其r
可执行文件来支持这一点
看看它的例子,它可能符合你的要求。关于非常基本的用法,请看一下
?commandArgs
对于更复杂的用法,两个常用的命令行参数和选项解析包是和。我一直在使用它们,它们完成了任务。我也看到了,但以前从未使用过。我错过了一个:德克建议你看看哪个看起来非常好用
最后,由于您似乎是通过管道传递参数,您可能会发现此函数对于泛化代码和允许参数为管道或文件非常有用
我想测试
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
或
你真正想看的是更智能的软件包——但是你仍然需要一个程序来阅读它们,在我的书中,
r
beatsRscript
…固定链接:。的确很有趣,主要是因为易于使用。但乍一看,我觉得它没有那么多的铃铛和哨子。谢谢你抓住了打字错误。经过多年的getopt(以及相关的C/C++libs)之后,我选择了luuuv docopt。
$ cat data_no_*.txt | ./myscript.r param_1
#!/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