对于经常与 Linux 打交道的生物信息分析童鞋们,我们今天分享一下怎么在命令行下通过传递参数(类似perl、python) 的方式执行 R 脚本。

一般来说,命令行下使用 Rscript 执行 R 脚本,需要下面几方面信息:

  • 一个输入的文件名(文件通常为 text 文本,包含了用于 R 处理的输入数据信息)

  • 一个可选的附加参数(如,输出的文件名:使用者不提供的话,通过程序指定默认值)

R 的方式接收参数

这种方式最常用的方法就是使用 commandArgs 函数。例如我们创建一个 testScript-1.R 的 R 程序:

#!/usr/bin/env Rscript
args = commandArgs(trailingOnly=TRUE)

## test if there is at least one argument: if not, return an error
if (length(args)==0) {
    stop("At least one argument must be supplied (input file).n", call.=FALSE)
} else if (length(args)==1) {
    # default output file
    args[2] = "out.txt"
}

## program ...
df = read.table(args[1], header=TRUE)
df_out = t(df)
write.table(df_out, file=args[2], row.names=TRUE, col.name=FALSE)

这样,我们就可以在命令行下执行 testScript-1.R

$ Rscript --vanilla testScript-1.R iris.txt out.txt

或者:

$ Rscript --vanilla testScript-1.R iris.txt

  • args = commandArgs(trailingOnly=TRUE),运行会产生一个字符串向量 args,该向量包含了 iris.txt 和 out.txt 两项信息。

  • test 部分为缺失以及需要指定的默认值处理。

  • program 部分为 testScript-1.R 接收参数后的程序处理:把输入文件行列转置,最后把转置后的结果保存到 out.txt

然而,当我们不输入任何文件参数时:

$ Rscript --vanilla testScript-1.R
Error: At least one argument must be supplied (input file).
Execution halted

Python 的方式接收参数

这是我们今天要讲的重点:利用 R optparse 包在命令行传递参数。optparse 主要包含了 下面几个功能:

  • make_option,用于选项声明,包括 flags, types, default values 以及 help messages。

  • OptionParser,用于读取传递给 R 脚本的参数。

  • parse_args,用于根据 make_option 的声明对 OptionParser 传递的参数进行解析。

下面,我们以创建一个名字为 testScript-2.R 传递参数程序为例,对 optparse 的使用进行详细说明。

创建 testScript-2.R,利用 optparse 定义参数

#!/usr/bin/env Rscript
library("optparse")

option_list = list(
      make_option(c("-f", "--file"), type="character", default=NULL, help="dataset file name", metavar="character"),
      make_option(c("-o", "--out"), type="character", default="out.txt", help="output file name [default = %default]", metavar="character")
);

opt_parser = OptionParser(option_list=option_list);
opt = parse_args(opt_parser);

这个程序会产生一个 opt 的列表,它包含了 option_list 自定义排序的所有参数,我们通过 opt$fileopt$out 就能使用具体的参数。

定义空参数异常

if (is.null(opt$file)){    
    print_help(opt_parser)    
    stop("At least one argument must be supplied (input file).", call.=FALSE)
}

print_help 会打印该选项在 option_list 中的帮助信息。

程序处理

## program ...
df = read.table(opt$file, header=TRUE)
df_out = t(df)
write.table(df_out, file=opt$out,  row.names=TRUE, col.name=FALSE)

print_help 会打印该选项在 option_list 中的帮助信息。

程序执行

在命令行下,我们执行:

或者:

最后,完整命令行下执行 testScript-2.R  如下:

$ Rscript --vanilla testScript-2.R -f iris.txt

# 或者:
$ Rscript --vanilla testScript-2.R -f iris.txt -o out.txt

ok,今天就介绍到这里。optparse 更多详细的信息,请参考:

  • https://cran.r-project.org/web/packages/optparse/index.html

  • https://cran.r-project.org/web/packages/optparse/optparse.pdf

  • https://cran.r-project.org/web/packages/optparse/vignettes/optparse.html

本文分享自微信公众号 - 生信科技爱好者(bioitee)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

R 包 optparse 之命令行参数传递的更多相关文章

  1. python3的命令行参数传递

    #coding:utf-8#命令行参数传递,例如输入: python <文件名>.py -help#这个结果就会打印help#sys.argv[0]代表"文件名",第一 ...

  2. Java带包结构调用命令行运行编译

    原文: https://www.toutiao.com/i6491809562037846542/ 带包结构调用命令行运行编译. 记事本编写两个简单的类 文件结构目录 启动DOS,进入文件所在目录 分 ...

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

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

  4. 手把手教你 通过 NuGet.Server 包 搭建nuget服务器,并使用桌面工具上传 nuget 包,免命令行

    新建web项目 工具:VS2013 版本:.Net Framework 4.6,低版本也行,不过要找到对应版本的Nuget.Server 装了NuGet客户端(百度如何安装) WebForm或MVC都 ...

  5. 浅谈optparse 解析命令行参数库

    使用的背景 在工作中我们经常要制定运行脚本的一些参数,因为有些东西是随着我么需求要改变的,所以在为们写程序的时候就一定不能把写死,这样我们就要设置参数 在python中我们可以通过sys 模板的arg ...

  6. Swift 包管理器命令行使用

    1.swift -version //swift 版本查看 2.swift build //swift工程编译 3.swift package generate-xcodeproj //创建Xcode ...

  7. python命令行参数传递JSON串

    有点小问题,一是传递的双引号被自动删除了,但是如果用单引号,JSON解析又不认. 所以,最后的方案是,传递单引号,但程序处理时做一个替换,替换成单引号.

  8. Go命令行参数解析flag包

    go语言提供的flag包可以解析命令行的参数,代码: package main import ( "flag" "fmt" ) func main() { // ...

  9. [Go] 命令行参数解析包(flag 包)使用详解

    Go 的 flag 包可以解析命令行的参数. 一.命令行语法 命令行语法主要有以下几种形式: cmd -flag       // 只支持bool类型 cmd -flag=xxx cmd -flag ...

  10. IDEA 直接点击运行执行正常,命令行下面执行Jar包出现部分乱码的情况。

    解决方案如上: 有个Springboot项目为了测试方便,模型类用中文作为字段属性,封装成Odata格式,在通过Springboot发布并打成jar包. 通过命令行启动jar包里面的Springweb ...

随机推荐

  1. Java面试——Spring

    一.Spring Bean 作用域 [1]singleton:该属性在 IOC容器仅创建一个 Bean实例(单例),IOC容器每次返回的是同一个 Bean实例.[2]prototype:该属性在 IO ...

  2. C#多线程开发-了解C#5.0 05

    前面一篇文章,了解了任务并行库.这是异步编程基础设施,它允许我们以模块化的方式设计程序,来组合不同的异步操作.解决了以往线程之间传递消息难等问题,但是我们在阅读和编写此类程序时还是会觉得非常难理解程序 ...

  3. PyQt5学习 (2)--QWidget(上)

    描述:   1.所有可视控件的基类   2.是一个最简单的空白控件   3.控件时用户界面的最小元素:接收各种事件.绘制在桌面上,展示给用户看   4.每个控件都是矩形的,它们按Z轴顺序排序   5. ...

  4. ACM-NEFU15届校赛-大二组

    A.小林找工作 #include<bits/stdc++.h> using namespace std; const int MAXN=1e5+10; int p[MAXN]; int m ...

  5. VBA GET POST HTTP VBA网络爬虫 最新Excel自动获取股票信息源码 EXCEL自动获取网络数据 最新VBA自动抓取股票数据源码

    最新Excel自动获取股票信息源码 EXCEL自动获取网络数据 最新VBA自动抓取股票数据源码 通过接口获取股票数据内容的主要优点包括以下几点: 实时性高:通过访问股票数据接口,可以实时获取到股票的实 ...

  6. kubectl管理多个集群配置

    需求描述:在一台机器上通过kubectl管理多个Kubernetes集群. 操作过程:将各集群的kubectl config文件中的证书内容转换,通过命令创建config文件:通过上下文切换使用不同集 ...

  7. python之算术运算符复习

    运算符 描述 实例 + 加 - 两个对象相加 a + b 输出结果 30 - 减 - 得到负数或是一个数减去另一个数 a - b 输出结果 -10 * 乘 - 两个数相乘或是返回一个被重复若干次的字符 ...

  8. 四月二十三号java基础知识

    1.异常是指在程序运行中由代码产生的一种错误2.按照错误的性质将错误分为语法错.语义错.和逻辑错三种3.语法错是有由于违反程序设计语言的语言规则而产生的错误,如标识符未标明.表达式中运算符与操作数类型 ...

  9. kettle从入门到精通 第十一课 kettle javascript 解析json数组

    1.json步骤虽然可以解析json数组,但是不够灵活.通过javascript步骤来解析json数组比较灵活,且可以按照需要组装数据流转到下个步骤. 1)步骤名称:可以自定义 2)Transform ...

  10. ASP.NET Core - 缓存之内存缓存(下)

    话接上篇 [ASP.NET Core - 缓存之内存缓存(上)],所以这里的目录从 2.4 开始. 2.4 MemoryCacheEntryOptions MemoryCacheEntryOption ...