美文网首页R
[R] 如何在Linux命令行进行参数传入?

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

作者: 生物信息与育种 | 来源:发表于2019-10-23 13:22 被阅读0次

    以前由于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 <- readr::read_delim(args$exp,delim = "\t")
    ko <- readr::read_delim(args$ko,delim = "\t",comment = '#',col_names=F)
    cazy <- readr::read_delim(args$cazy,delim = '\t')
    cog <- readr::read_delim(args$cog,delim = '\t')
    ......
    

    命令行运行:
    帮助

    $Rscript getopt_test.R -h
    Usage: getopt_test.R [-[-exp|e] <character>] [-[-ko|k] <character>] [-[-cazy|z] <character>] [-[-cog|c] <character>] [-[-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)
    

    可以看下他提供的例子:
    https://github.com/jokergoo/GetoptLong
    https://www.rdocumentation.org/packages/GetoptLong/versions/0.1.7/topics/GetoptLong

     #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 <- readr::read_delim(expression,delim = "\t")
    ko <- readr::read_delim(ko,delim = "\t",comment = '#',col_names=F)
    cazy <- readr::read_delim(cazy,delim = '\t')
    cog <- readr::read_delim(cog,delim = '\t')
    

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

    $ 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
    

    短参传入:
    如果所有参数的首字母不同,用首字母即可;如果有些参数名称近似,则最好用多个字母,否则会辨别不了。
    比如我这里的cogcazy参数,首字母相同,明显不能都用c,我把其中一个改成大写的C也辨别不了;其中一个用一个首字母,另一个用两个首字母也不行。用coca就可以了。所以参数的名字一定要明显区分开来。

    $ 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
    

    Ref:
    https://www.cnblogs.com/timeisbiggestboss/p/7811009.html
    https://www.rdocumentation.org/packages/GetoptLong/versions/0.1.7/topics/GetoptLong

    相关文章

      网友评论

        本文标题:[R] 如何在Linux命令行进行参数传入?

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