R语言传参快速使用脚本
- 简便版
args <- commandArgs(T)
input <- args[1]
print(input)
- 进阶版
getopt方法
library(getopt)
spec <- matrix(
c("input", "i", 2, "character", "Input value",
"test", "t", 1, "numeric", "Test value",
"help", "h", 0, "logical", "Help document"),
byrow=TRUE, ncol=5)
opt <- getopt(spec=spec)
if( !is.null(opt$help)||is.null(opt$input)){
cat(paste(getopt(spec=spec, usage = T), "\n"))
quit()
}
if (is.null(opt$test)) {opt$test=0}
input <- opt$input
test <- opt$test
print(input)
print(test)
optparse方法1
library(optparse)
parser <- OptionParser()
parser <- add_option(parser, c("-c", "--count"), type="integer", default=5,
help="Number of random normals to generate [default %default]",
metavar="number",action = "store")
opt = parse_args(parser)
print(opt$count)
optparse方法2
library(optparse)
op_list <- list(make_option(c("-c", "--count"), type = "integer", default = 5,action = "store", help = "Number of random normals to generate [default %default]",metavar="number"))
parser <- OptionParser(option_list = op_list)
opt = parse_args(parser)
print(opt$count)
R使用getopt包传参
- 补充:系统自带的传参方法commandArgs,类似于Python的sys.argv。
args <- commandArgs(T)
input <- args[1]
print(input)
commandArgs是R内置获取系统命令行参数的函数,commandArgs(T)是的commandArgs(trailingOnly = TRUE)简写,如果不设置为TRUE,则传入的参数将从第6个开始,即args[6],因此一般设置为TRUE,这样第一个参数是args[1],第二个参数是args[2]。具体信息可以查看这篇博客,写得挺好的。
- 简介:getopt是R语言传参常用的一个包,建议使用BiocManager::install('getopt')进行安装,其主要函数只有一个getopt,其参数如下:
getopt( spec=NULL, opt=commandArgs(TRUE), command=strsplit(commandArgs(FALSE)[4],"=")[[1]][2], usage=FALSE, debug=FALSE )
第一步构建参数矩阵spec
每个参数有5个属性,第1个为参数的长名称;第2个为参数短名称;第3个为是否为必选参数,0表示不传入参数,1表示可选传入参数,传入不传入均可,2表示必须传入参数;第4个为参数类型,字符串character,数字numeric,逻辑值logical;第5个为帮助信息。
library(getopt)
spec <- matrix(
c("input", "i", 2, "character", "Input value",
"test", "t", 1, "numeric", "Test value",
"help", "h", 0, "logical", "Help document"),
byrow=TRUE, ncol=5)
第二步,使用矩阵spec构建参数列表
直接使用函数getopt,opt=commandArgs(TRUE)就是调用系统的commandArgs函数获取命令行参数,command是脚本名称,command=strsplit(commandArgs(FALSE)[4],"=")[[1]][2]可以自动获取,usage决定是否展示帮助信息,获取参数需要设置为F。这些参数一般不用改,用默认的即可。
opt <- getopt(spec=spec)
第三步设置帮助信息
如果有-h参数或者缺失某个参数,则展示帮助信息,展示信息也是用getopt(spec=spec, usage = T),但这里的usage = T。
if( !is.null(opt$help)||is.null(opt$input)){
cat(paste(getopt(spec=spec, usage = T), "\n"))
quit()
}
第四步设置默认值
如果某些可选参数没有传入参数则给它一个默认值。
if (is.null(opt$test)) {opt$test=0}
脚本使用示例
- test.R文件
library(getopt)
spec <- matrix(
c("input", "i", 2, "character", "Input value",
"test", "t", 1, "numeric", "Test value",
"help", "h", 0, "logical", "Help document"),
byrow=TRUE, ncol=5)
opt <- getopt(spec=spec)
#help
if( !is.null(opt$help)||is.null(opt$input)){
cat(paste(getopt(spec=spec, usage = T), "\n"))
quit()
}
#default
if (is.null(opt$test)) {opt$test=0}
input <- opt$input
test <- opt$test
print(input)
print(test)
- 运行脚本:
#查看帮助文档
~ $ Rscript test.R -h
Usage: test.R [-[-input|i] [<character>]] [-[-test|t] <double>] [-[-help|h]]
-i|--input Input value
-t|--test Test value
-h|--help Help document
#传参
~ $ Rscript test.R -i 1 -t 2
[1] "1"
[1] 2
~ $ Rscript test.R -i 1
[1] "1"
[1] 0
R使用optparse包传参
如果有使用Python的argparse模块传参的习惯,那optparse包可能会更适合你。
类似地,可以使用BiocManager::install('optparse')安装。
构建参数对象
OptionParser函数
OptionParser(usage = "usage: %prog [options]", option_list = list(),
add_help_option = TRUE, prog = NULL, description = "", epilogue = "",
formatter = IndentedHelpFormatter)
usage展示脚本用法,option_list是后面添加参数属性的另一种方法会用到,后面会介绍,add_help_option是否构建帮助信息,默认为True,prog脚本名称,脚本描述description,尾注描述epilogue。
optparse包有两种传参方法
-
第一种方法
使用add_option函数
add_option(object, opt_str, action = NULL, type = NULL, dest = NULL,
default = NULL, help = "", metavar = NULL, callback = NULL,
callback_args = NULL)
object是由OptionParser函数构建的对象,opt_str输入短名称和长名称的向量,action是对参数的预设操作,默认为store不进行任何操作,type参数数据类型,dest参数变量名称,default默认值,如果设置了具体数值则为可选参数,如果没有设置,则是必选参数,help帮助信息,metavar参数别名。
parser <- OptionParser()
parser <- add_option(parser, c("-c", "--count"), type="integer", default=5,
help="Number of random normals to generate [default %default]",
metavar="number",action = "store")
opt = parse_args(parser)
示例1
- rtest.R文件
library(optparse)
parser <- OptionParser()
parser <- add_option(parser, c("-c", "--count"), type="integer", default=5,
help="Number of random normals to generate [default %default]",
metavar="number",action = "store")
parser <- add_option(parser, c("-t", "--test"), type="character", default=F,
help="Test value",
metavar="Test",action = "store")
opt = parse_args(parser)
print(opt$count)
print(opt$test)
- 运行脚本
#查看帮助文档
~ $ Rscript rtest.R -h
Usage: rtest.R [options]
Options:
-h, --help
Show this help message and exit
-c NUMBER, --count=NUMBER
Number of random normals to generate [default 5]
-t TEST, --test=TEST
Test value
#传参
~ $ Rscript rtest.R -c 4 -t a
[1] 4
[1] "a"
~ $ Rscript rtest.R -t a
[1] 5
[1] "a"
-
第二种方法
使用make_option函数
make_option(opt_str, action = NULL, type = NULL, dest = NULL, default = NULL,
help = "", metavar = NULL, callback = NULL, callback_args = NULL)
这里的参数跟add_option函数参数实际上是一样的,只是使用方法不同,这里就不再赘述。
op_list <- list(make_option(c("-c", "--count"), type = "integer", default = 5,action = "store", help = "Number of random normals to generate [default %default]",metavar="number"))
parser <- OptionParser(option_list = op_list)
示例2
- rtest2.R文件
library(optparse)
op_list <- list(make_option(c("-c", "--count"), type = "integer", default = 5,action = "store", help = "Number of random normals to generate [default %default]",metavar="number"),
make_option(c("-t", "--test"), type = "character", default = F, action = "store", help = "Test value",metavar="test"))
parser <- OptionParser(option_list = op_list)
opt = parse_args(parser)
print(opt$count)
print(opt$test)
- 运行脚本
#查看帮助文档
~ $ Rscript rtest2.R -h
Usage: rtest2.R [options]
Options:
-c NUMBER, --count=NUMBER
Number of random normals to generate [default 5]
-t TEST, --test=TEST
Test value
-h, --help
Show this help message and exit
#传参
~ $ Rscript rtest2.R -c 4 -t a
[1] 4
[1] "a"
~ $ Rscript rtest2.R -t a
[1] 5
[1] "a"