方法一:commandArgs()方法
- 优点:Rbase自带,简单方便
- 缺点:功能不够强大,也不能设置缺省值(但是可以在脚本中通过长度判断设置可缺省最后的连续几个参数,如下所示:如果总参数为5个时允许缺省后3个参数)。
- 直接通过
Rsript xx.R arg1 arg2 arg3 arg4 arg5
运行脚本。这种方法只能设置位置参数,各参数位置固定,不能写乱,所以如果参数简单且数量少,可以用此种方法。 - 如果不设置参数控制,直接在脚本第一行写一句
Args <- commandArgs(T)
即可,然后直接Rscript xx.R a1 a2
运行脚本,参数a1,a2的值会存储在Args中,脚本中使用Args[[1]], Args[[2]]
获取它们即可。
# 示例脚本(当阐述格式为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]])
- 终端中运行
Rscript xx.R arg1 arg2 arg3 arg4 arg5
。
方法二:optparse包方法
通过加载optparse包进行参数设置,这种方法类似与python中argparse方法设置参数,如果不是简单的一两个参数推荐这种方法调用参数。
- 这种方法,可以设置默认值,指定参数数据类型,帮助信息。
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
- 这种方法使用参数不用考虑参数位置,缺省默认值设置也很灵活,复杂脚本参数应该使用这种方法。