R语言传参2022-08-24

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"
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容