r linux命令行参数,[R] 如何在Linux命令行进行参数传入?

以前由于R命令行传参不友好,经常嵌套在其他程序语言(如Perl/Python)中来进行传参,但现在也陆续有一些方式来实现R的传参了,这里简单罗列下。

方法一

最传统的方法就是使用系统自带的commandArgs函数,直接按位置顺序传入。这种方法简短、快速,适合个人使用。一般也能满足我们的需求了,但对于其他用户是不够友好的。

#test.R

args=commandArgs(T)

file=read.table(args[1])

...

#command line

$Rscript test.R file

方法二

使用getopt包,参数形式为:

getopt(

spec = NULL,

opt = commandArgs(TRUE),

command = get_Rscript_filename(),

usage = FALSE,

debug = FALSE

)

说明:

spec是一个4-5列的矩阵,里面包括了参数信息,前四列是必须的,第五列可选。

第一列:参数的longname,多个字符。

第二列:参数的shortname,一个字符。

第三列:参数是必须的,还是可选的,数字:0代表不接参数 ;1代表必须有参数;2代表参数可选。

第四列:参数的类型。logical;integer;double;complex;character;numeric

第五列:注释信息,可选。

应用示例:

library(getopt)

# 构建参数矩阵

library(getopt)

spec = matrix(c(

'verbose', 'v', 2, "integer",

'help' , 'h', 0, "logical",

'count' , 'c', 1, "integer",

'mean' , 'm', 1, "double",), byrow=TRUE, ncol=4)

#传参

opt = getopt(spec)

以我的数据作为例子,部分脚本如下:

library(getopt)

command=matrix(c("exp","e",1,"character",

"ko","k",1,"character",

"cazy","z",1,"character",

"cog","c",1,"character",

"help","h",0,"logical"),byrow=T,ncol=4)

args=getopt(command)

#帮助信息

if (!is.null(args$help) || is.null(args$exp) || is.null(args$ko) || is.null(args$cazy)|| is.null(args$cog)) {

cat(paste(getopt(command, usage = T), "\n"))

q()

}

#读入参数

exp

ko

cazy

cog

......

命令行运行:

帮助

$Rscript getopt_test.R -h

Usage: getopt_test.R [-[-exp|e] ] [-[-ko|k] ] [-[-cazy|z] ] [-[-cog|c] ] [-[-help|h]]

运行

$ Rscript getopt_test.R --exp protein.xls --ko test.ko --cazy cazy.anno --cog protein2cog.xls

方法三

使用GetoptLong包。这是由大佬Zuguang Gu开发(就是开发ComplexHeatmap

和circlize的那位),借用了Perl GetoptLong模块的传参形式,用法也几乎一样。

GetoptLong(..., help = TRUE, version = TRUE, envir = parent.frame(), argv_str = NULL,

head = NULL, foot = NULL, script_name = NULL)

#r script

library(GetoptLong)

cutoff = 0.05 #default

GetoptLong(

"number=i", "Number of items, integer, mandatory option",

"cutoff=f", "cutoff to filter results, optional, default (0.05)",

"verbose", "print messages"

)

#Then you can call the script from command line either by:

$ Rscript foo.R --number 4 --cutoff 0.01 --verbose

$Rscript foo.R -n 4 -c 0.01 -v

$ Rscript foo.R -n 4 --verbose

以我自己的数据为例。部分R脚本如下:

suppressMessages(library(GetoptLong))

suppressMessages(library(tidyverse))

GetoptLong(

"expression=s", "protein expression matrix",

"ko=s", "ko annotation outcome",

"cazy=s", "cazy annotation outcome",

"cog=s", "cog annotation outcome",

"verbose!","print messages"

)

#读入参数

exp

ko

cazy

cog

命令行运行会自动生成帮助文档。

$ Rscript test.R --help

Usage: Rscript function_summary.R [options]

--expression character

protein expression matrix

--ko character

ko annotation outcome

--cazy character

cazy annotation outcome

--cog character

cog annotation outcome

--verbose

print messages

--help

Print help message and exit.

--version

Print version information and exit.

长参传入:

$Rscript test.R --expression protein.xls --ko test.ko --cazy cazy.anno --cog protein2cog.xls

短参传入:

如果所有参数的首字母不同,用首字母即可;如果有些参数名称近似,则最好用多个字母,否则会辨别不了。

比如我这里的cog和cazy参数,首字母相同,明显不能都用c,我把其中一个改成大写的C也辨别不了;其中一个用一个首字母,另一个用两个首字母也不行。用co和ca就可以了。所以参数的名字一定要明显区分开来。

$ Rscript test.R -e protein.xls -k test.ko -c cazy.anno -C protein2cog.xls

Option c is ambiguous (cazy, cog)

Option c is ambiguous (cazy, cog)

Usage: Rscript test.R [options]

--expression character

protein expression matrix

--ko character

ko annotation outcome

--cazy character

cazy annotation outcome

--Cog character

cog annotation outcome

--verbose

print messages

--help

Print help message and exit.

--version

Print version information and exit.

这个就可以了

$ Rscript test.R -e protein.xls -k test.ko -ca cazy.anno -co protein2cog.xls

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值