ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-10-29 04:51:11  阅读:298  来源: 互联网

标签:bash unix stdin linux r


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

对于更复杂的用法,两个用于命令行参数和选项解析的流行软件包是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

标签:bash,unix,stdin,linux,r
来源: https://codeday.me/bug/20191029/1957358.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有