美文网首页
R语言传参2022-08-24

R语言传参2022-08-24

作者: 黄甫一 | 来源:发表于2022-08-22 16:33 被阅读0次

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"

相关文章

  • R语言传参2022-08-24

    R语言传参快速使用脚本 简便版 进阶版 getopt方法 optparse方法1 optparse方法2 R使用g...

  • iOS多线程之pthread的简单使用

    前言 pthread是c语言编写的,基本用不到,了解一下就好. 线程创建代码 传参:C语言传参 oc传参

  • 《书语者》D9/23

    【七月影语】20171031《书语者》D5 言传身教。谈到言传身教,颇有感触的。父母不是爱书之人,当然,他们的上一...

  • 2019.6.19 读书 肆

    “世之所贵道者,书也,书不过语,语有贵也。语之所贵者,意也,意有所随,意之所随者,不可言传也。而世因贵言传书。” ...

  • Java Stream Collector

    Collector三参数 Collector T - 入参类型 A - 容器类型 R - 结果类...

  • 20180205周一

    世之所贵道者,书也。书不过语,语有贵也。语之所贵者意也,意有所随。意之所随者,不可以言传也,而世因贵言传书。世虽贵...

  • 2019-01-18

    来到潮州佛母寺参学收获良多,不能一一道来,有些东西不能言传,只把能言传的东西稍稍说出来,供大家分享。一、注重学习与...

  • 意之贵也

    《庄子》曰:语之所贵者,意也。意有所施,意之所随者不可 以言传也。而世因贵言传书。 是知意之...

  • 读《活法》第五章

    今天和大家分享《活法》第五章内容:有效沟通,铸就成功。 语言传递信息,语言展现自我,语言调节生活,语言传承文明,语...

  • R语言的传参

    越南式三明治 1. mac或linux: 脚本第一行加: #!/usr/bin/Rscript 2. comman...

网友评论

      本文标题:R语言传参2022-08-24

      本文链接:https://www.haomeiwen.com/subject/vrpoprtx.html