以前由于R
命令行传参不友好,经常嵌套在其他程序语言(如Perl/Python
)中来进行传参,但现在也陆续有一些方式来实现R
的传参了,这里简单罗列下。
方法一
最传统的方法就是使用系统自带的commandArgs
函数,直接按位置顺序传入。这种方法简短、快速,适合个人使用。一般也能满足我们的需求了,但对于其他用户是不够友好的。
#test.R args=commandArgs(T) file=read.table(args[1]) ... #command line $Rscript test.R file
方法二
使用getopt
包,参数形式为:
getopt( spec = NULL, opt = commandArgs(TRUE), command = get_Rscript_filename(), usage = FALSE, debug = FALSE )
说明:
spec是一个4-5
列的矩阵,里面包括了参数信息,前四列是必须的,第五列可选。
- 第一列:参数的
longname
,多个字符。 - 第二列:参数的
shortname
,一个字符。 - 第三列:参数是必须的,还是可选的,数字:
0
代表不接参数 ;1
代表必须有参数;2
代表参数可选。 - 第四列:参数的类型。
logical;integer;double;complex;character;numeric
- 第五列:注释信息,可选。
应用示例:
library(getopt) # 构建参数矩阵 library(getopt) spec = matrix(c( 'verbose', 'v', 2, "integer", 'help' , 'h', 0, "logical", 'count' , 'c', 1, "integer", 'mean' , 'm', 1, "double",), byrow=TRUE, ncol=4) #传参 opt = getopt(spec)
以我的数据作为例子,部分脚本如下:
library(getopt) command=matrix(c("exp","e",1,"character", "ko","k",1,"character", "cazy","z",1,"character", "cog","c",1,"character", "help","h",0,"logical"),byrow=T,ncol=4) args=getopt(command) #帮助信息 if (!is.null(args$help) || is.null(args$exp) || is.null(args$ko) || is.null(args$cazy)|| is.null(args$cog)) { cat(paste(getopt(command, usage = T), "\n")) q() } #读入参数 exp <- readr::read_delim(args$exp,delim = "\t") ko <- readr::read_delim(args$ko,delim = "\t",comment = '#',col_names=F) cazy <- readr::read_delim(args$cazy,delim = '\t') cog <- readr::read_delim(args$cog,delim = '\t') ......
命令行运行:
帮助
$Rscript getopt_test.R -h Usage: getopt_test.R [-[-exp|e] <character>] [-[-ko|k] <character>] [-[-cazy|z] <character>] [-[-cog|c] <character>] [-[-help|h]]
运行
$ Rscript getopt_test.R --exp protein.xls --ko test.ko --cazy cazy.anno --cog protein2cog.xls
方法三
使用GetoptLong
包。这是由大佬Zuguang Gu开发(就是开发ComplexHeatmap
和circlize的那位),借用了Perl GetoptLong
模块的传参形式,用法也几乎一样。
GetoptLong(..., help = TRUE, version = TRUE, envir = parent.frame(), argv_str = NULL, head = NULL, foot = NULL, script_name = NULL)
可以看下他提供的例子:
https://github.com/jokergoo/GetoptLong
https://www.rdocumentation.org/packages/GetoptLong/versions/0.1.7/topics/GetoptLong
#r script library(GetoptLong) cutoff = 0.05 #default GetoptLong( "number=i", "Number of items, integer, mandatory option", "cutoff=f", "cutoff to filter results, optional, default (0.05)", "verbose", "print messages" ) #Then you can call the script from command line either by: $ Rscript foo.R --number 4 --cutoff 0.01 --verbose $Rscript foo.R -n 4 -c 0.01 -v $ Rscript foo.R -n 4 --verbose
以我自己的数据为例。部分R脚本如下:
suppressMessages(library(GetoptLong)) suppressMessages(library(tidyverse)) GetoptLong( "expression=s", "protein expression matrix", "ko=s", "ko annotation outcome", "cazy=s", "cazy annotation outcome", "cog=s", "cog annotation outcome", "verbose!","print messages" ) #读入参数 exp <- readr::read_delim(expression,delim = "\t") ko <- readr::read_delim(ko,delim = "\t",comment = '#',col_names=F) cazy <- readr::read_delim(cazy,delim = '\t') cog <- readr::read_delim(cog,delim = '\t')
命令行运行会自动生成帮助文档。
$ Rscript test.R --help Usage: Rscript function_summary.R [options] --expression character protein expression matrix --ko character ko annotation outcome --cazy character cazy annotation outcome --cog character cog annotation outcome --verbose print messages --help Print help message and exit. --version Print version information and exit.
长参传入:
$Rscript test.R --expression protein.xls --ko test.ko --cazy cazy.anno --cog protein2cog.xls
短参传入:
如果所有参数的首字母不同,用首字母即可;如果有些参数名称近似,则最好用多个字母,否则会辨别不了。
比如我这里的cog
和cazy
参数,首字母相同,明显不能都用c
,我把其中一个改成大写的C
也辨别不了;其中一个用一个首字母,另一个用两个首字母也不行。用co
和ca
就可以了。所以参数的名字一定要明显区分开来。
$ Rscript test.R -e protein.xls -k test.ko -c cazy.anno -C protein2cog.xls Option c is ambiguous (cazy, cog) Option c is ambiguous (cazy, cog) Usage: Rscript test.R [options] --expression character protein expression matrix --ko character ko annotation outcome --cazy character cazy annotation outcome --Cog character cog annotation outcome --verbose print messages --help Print help message and exit. --version Print version information and exit.
这个就可以了
$ Rscript test.R -e protein.xls -k test.ko -ca cazy.anno -co protein2cog.xls
Ref:
https://www.cnblogs.com/timeisbiggestboss/p/7811009.html
https://www.rdocumentation.org/packages/GetoptLong/versions/0.1.7/topics/GetoptLong