[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 <- 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
短参传入:
如果所有参数的首字母不同,用首字母即可;如果有些参数名称近似,则最好用多个字母,否则会辨别不了。
比如我这里的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
Ref:
https://www.cnblogs.com/timeisbiggestboss/p/7811009.html
https://www.rdocumentation.org/packages/GetoptLong/versions/0.1.7/topics/GetoptLong
[R] 如何在Linux命令行进行参数传入?的更多相关文章
- linux命令行传递参数定期执行PHP文件
最近在做一个项目,需要在linux下传递参数定期执行PHP文件,网上查询资料,确实有相关资料,现整理如下: 1.linux执行PHP文件 #{PHP安装bin路径} {PHP文件路径} {需要参数1 ...
- 如何在Linux命令行中创建以及展示演示稿
导读 你在准备一场演讲的时候,脑海可能会先被图文并茂.形象华丽的演示图稿所占据.诚然,没有人会否认一份生动形象的演讲稿所带来的积极作用.然而,并非所有的演讲都需要TED Talk的质量.更多时候,演讲 ...
- 如何在linux命令行无界面下使用selenium
1.安装Xvfb和pyvirtualdisplay sudo apt-get install xvfbpip install pyvirtualdisplay 2.安装chrome, chromedr ...
- 在linux命令行下执行php 程序
如何在linux命令行下,执行php程序. 例子 打印当前时间 php -r "echo time()" 随机输出一个数字 php -r "echo rand(1,20) ...
- 像黑客一样使用 Linux 命令行
前言 之前在博客园看到一篇介绍 IntelliJ IDEA 配置的文章,它里面用的是 gif 动态图片进行展示,我觉得很不错.所以在我今天以及以后的博文中,我也会尽量使用 gif 动图进行展示.制作 ...
- 十五个最常用Linux命令行 - imsoft.cnblogs
众多Linux管理员在使用Linux的时候会经常使用到很多Linux命令行,其中有绝大部分不是经常使用到的.在本文中主要为大家总结了经常使用的十五个最常用Linux命令行,希望对刚刚接触Linux命令 ...
- 《Linux命令行大全》系列(三、Linux 系统)
在<Linux命令行大全>一书中,第3章名称是 Linux 系统. 概念太大,不过该节内容却是 Linux 系统最为核心的基础——查看 Linux 系统. ls 命令 显示目录自身信息或目 ...
- LINUX命令行操作
Linux 命令行快捷键 7条回复 涉及在linux命令行下进行快速移动光标.命令编辑.编辑后执行历史命令.Bang(!)命令.控制命令等.让basher更有效率. 说明 Ctrl – k: 先按住 ...
- Linux命令行编辑快捷键
Linux命令行编辑快捷键: history 显示命令历史列表 ↑(Ctrl+p) 显示上一条命令 ↓(Ctrl+n) 显示下一条命令 !num 执行命令历史列表的第num条命令 !! 执行上一条命令 ...
随机推荐
- Coursera Deep Learning笔记 序列模型(一)循环序列模型[RNN GRU LSTM]
参考1 参考2 参考3 1. 为什么选择序列模型 序列模型能够应用在许多领域,例如: 语音识别 音乐发生器 情感分类 DNA序列分析 机器翻译 视频动作识别 命名实体识别 这些序列模型都可以称作使用标 ...
- 【二食堂】Beta - Scrum Meeting 4
Scrum Meeting 4 例会时间:5.17 18:30~18:50 进度情况 组员 当前进度 今日任务 李健 1. 继续完成文本区域划词添加的功能 issue 1. 划词功能已经实现,继续开发 ...
- find&正则表达式
标准的正则表示式格式 常用元字符 代码 说明 . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线 \s 匹配任意的空白符 \d 匹配数字 \b 匹配单词的开始或结束 ^ 匹配字符串的开始 $ ...
- sonar-project.propertie分析参数
SonarScanner 是当您的构建系统没有特定扫描仪时使用的扫描仪. 配置您的项目 在你的项目根目录中创建一个名为的配置文件 sonar-project.properties # must be ...
- AOP源码解析:AspectJAwareAdvisorAutoProxyCreator类的介绍
AspectJAwareAdvisorAutoProxyCreator 的类图 上图中一些 类/接口 的介绍: AspectJAwareAdvisorAutoProxyCreator : 公开了Asp ...
- Swift-技巧(一)缩放并填充图片
摘要 直接操作图片来实现它的缩放或者填充多余空间,首选 UIGraphicsBeginImageContext 函数来实现,它就相当于一个画布,你甚至可以用它来涂鸦. 最近有一个需求,就是将图片先等比 ...
- Vue脚手架最新版本安装使用
现在很多的插件如Vant 这类的样式框架,都去兼容了Vue的3.0版本,所以我总结一下如何去简单的搭建一个Vue3.0的框架 开始 一,如何安装 在这里说明一下,Vue脚手架版本,和Vue版本是两个东 ...
- diff 命令,防止遗忘
常规输出: diff 1.file 2.file 并排格式输出: diff 1.file 2.file -y -W 50 显示说明 "|"表示前后2个文件内容有不同 "& ...
- 攻防世界 Misc 新手练习区 如来十三掌 Writeup
攻防世界 Misc 新手练习区 如来十三掌 Writeup 题目介绍 题目考点 佛曰加密.base64.Rot13等加密方法的了解 Writeup 下载并打开附件 联想到佛曰加密,复制内容到 佛曰加密 ...
- 工程中实际问题解决两例——基于C#
工程中实际问题解决两例--基于C# 目录 工程中实际问题解决两例--基于C# 1. try catch的妙用 1.1 遇到问题的现象 1.2 原因分析 1.2.1 先从数据库入手 1.2.2 代码日志 ...