R语言Rscript脚本-参数设置

2023-05-17 17:04:06 浏览数 (1)

方法一:commandArgs()方法

  • 优点:Rbase自带,简单方便
  • 缺点:功能不够强大,也不能设置缺省值(但是可以在脚本中通过长度判断设置可缺省最后的连续几个参数,如下所示:如果总参数为5个时允许缺省后3个参数)。
  1. 直接通过Rsript xx.R arg1 arg2 arg3 arg4 arg5运行脚本。这种方法只能设置位置参数,各参数位置固定,不能写乱,所以如果参数简单且数量少,可以用此种方法。
  2. 如果不设置参数控制,直接在脚本第一行写一句Args <- commandArgs(T)即可,然后直接Rscript xx.R a1 a2运行脚本,参数a1,a2的值会存储在Args中,脚本中使用Args[[1]], Args[[2]]获取它们即可。
代码语言:text复制
# 示例脚本(当阐述格式为5个或者2个时成功运行脚本,否则报错并提示错误信息)
# 当想要设置五个参数时使用下列代码:
Args <- commandArgs(T)
# --------------------------------如果简单应用,可以直接掠过下面代码,不需要使用,只要上面一句即可。
if ( length(Args) %in% c(0,1,3,4,6:100)) {
# 即:当参数为个数为0,1,3,4,6:100时报错,并提示以下帮助信息
    stop({
         cat("Error: Argu errorn Please use args correctlynHelp:n Rscrpit this.R [outdir] [method] [pvalue] [fdr] [log2fc] n")
         cat(" --------------------------------------------------------n")
         cat(" 需要设置[outdir] [method] 2个或者全部5个参数, 注:各参数位置不能错!n")
         cat("   [outdir] : 输出结果文件夹, 如果文件夹下原本有内容会覆盖文件n")
         cat("   [method] : 差异分析方法, 取值为0, 1, 2, 3, 4。如为芯片数据, 只能设置为4n")
         cat("                  0: 全部方法(默认) 1: edgeR; 2: Deseq2 3: Limma.voom 4: Limman")
         cat("   [pvale] [fdr] [log2fc] : 差异分析阈值, 默认为p=0.05, fdr=0.1, log2fc=1n")
    })
} else if (length(Args) == 2) { 
# 允许参数个数为2个,当阐述个数为2个时,后面三项参数使用以下默认值
        p = 0.05
        fdr = 0.1
        log2fc = 1
} 

cat("Hello, World!", Args[[1]], Args[[2]], p)
cat("Hello, World!", Args[[1]], Args[[2]],  Args[[3]], Args[[4]],  Args[[5]])
  1. 终端中运行Rscript xx.R arg1 arg2 arg3 arg4 arg5

方法二:optparse包方法

通过加载optparse包进行参数设置,这种方法类似与python中argparse方法设置参数,如果不是简单的一两个参数推荐这种方法调用参数。

  • 这种方法,可以设置默认值,指定参数数据类型,帮助信息。
代码语言:text复制
library(optparse) # 需要用户自己事先安装
option_list <- list(
# -n 为短参数 --name为参数调用时的名称,type:数据类型, action默认store就行,其他顾名思义。
  make_option(c("-n", "--name"), type = "character", default = NULL,
              action = "store", help = "项目名称,必须设置,最好简短且有意义"
  ),
  make_option(c("-t", "--thread"), type = "integer", default = 4,
              action = "store", help = "多线程, 默认为4, 请根据自己计算机资源设置"
  ),
  make_option(c("-m", "--method"), type = "integer", default = 2,
              action = "store", 
              help = "差异分析方法, 取值为1, 2(默认), 1:egdeR, 2:额外进行DESeq2   Limma-voom"
  ),
    make_option(c("-p", "--pvalue"), type = "numeric", default = 0.05,
              action = "store", help = "差异基因筛选阈值p, 默认0.05"
  ),
    make_option(c("-q", "--fdr"), type = "numeric", default = NULL,
              action = "store", help = "差异基因筛选阈值fdr, 默认NULL"
  ),
    make_option("--fc", type = "numeric", default = 2,
              action = "store", help = "差异基因筛选阈值foldchange, 默认2,即为logfc=1"
  )
  )
# 解析参数
opt = parse_args(OptionParser(option_list = option_list, 
                 usage = "此脚本为RNAseq差异分析流程!",
                 description = "格式: Rscript %prog [options]n将清洗好的eset及group文件放在脚本运行目录下的data文件夹中"))

if( is.null(opt$name) ) { stop({ 
    cat("Error:nthe argu -n[--name] must be set!nPlease use Rscript xx.R -h to get help infon") 
    }) }
  • 终端运行 Rscript xx.R -n yyds -t 8 -m 1 -p 0.05 -q 0.1 --fc 4
  • 这种方法使用参数不用考虑参数位置,缺省默认值设置也很灵活,复杂脚本参数应该使用这种方法。

0 人点赞