【R基础】R脚本解析命令行参数
2021-10-25 本文已影响0人
caokai001
1.命令行方式运行R脚本
- (主要)命令行中指定解析器
$ Rscript test.R
$ cd /home/kcao/BG-share/R/script_create
$ cat >test.R
print("Hello R!")
$ Rscript test.R
- 命令行中省略解析器
$ ./test.R
,需在脚本中指定解析器,并基于可执行权限
#!/usr/bin/Rscript or #!/home/kcao/anaconda3/bin/Rscript
(base) [23:49:04] kcao@localhost:~/BG-share/R/script_create
$ which Rscript
~/anaconda3/bin/Rscript
$ cat >test.R
#!/home/kcao/anaconda3/bin/Rscript
print("Hello R!")
$ chmod 755 test.R
$ ./test.R
2.R语言接受命令行参数方法
R接受命令的参数有三个常见的方法commandArgs()、getopt()、OptionParser()
其中第一个是R自带的函数,后面两个分别来自包getopt和optparse。
2.1 commandArgs()
这是个R的内置命令,和perl的@ARGV或者和python的sys.argv类似,就是将来自于命令的参数存入向量(数组)中。但是与perl和python的不同,它的前面几个元素不是命令行的参数,先尝试打印一下这个参数是怎样的。
对于参数的位置是可变的,在R所在路径和R脚本的路径这两个参数之间是Rscript的参数,这些参数的数量是可变的. 输入的参数是从第6个开始
$ cat > test1.R
# commandArgs()就返回一个包含参数信息的向量
args <- commandArgs()
print(args)
$ Rscript test1.R Hello R
[1] "/home/kcao/anaconda3/lib/R/bin/exec/R" # R所在的路径
[2] "--slave" # Rscript的参数
[3] "--no-restore" # Rscript的参数
[4] "--file=test1.R" # 运行R脚本的路径
[5] "--args" # 脚本参数flag
[6] "Hello" # 第一个参数
[7] "R" # 第二个参数
$ Rscript
Usage: /path/to/Rscript [--options] [-e expr [-e expr2 ...] | file] [args]
--options accepted are
--help Print usage and exit
--version Print version and exit
--verbose Print information on progress
--default-packages=list
Where 'list' is a comma-separated set
of package names, or 'NULL'
or options to R, in addition to --slave --no-restore, such as
--save Do save workspace at the end of the session
--no-environ Don't read the site and user environment files
--no-site-file Don't read the site-wide Rprofile
--no-init-file Don't read the user R profile
--restore Do restore previously saved objects at startup
--vanilla Combine --no-save, --no-restore, --no-site-file
--no-init-file and --no-environ
'file' may contain spaces but not shell metacharacters
Expressions (one or more '-e <expr>') may be used *instead* of 'file'
See also ?Rscript from within R
这样一来就会导致R脚本的参数的索引不固定,针对这种情况,你也可以添加一个参数来削掉R脚本参数之前的参数了。
$ cat > test2.R
args <- commandArgs(trailingOnly = TRUE)
print(args)
$ Rscript test2.R Hello R
[1] "Hello" "R"
2.2 optparse
使用之前安装包
install.packages("optparse")
其中的方法OptionParser()的用法为:其中最重要的参数是option_list,这个参数接受一个列表,这个列表是被用来描述命令参数的解析方式的。
OptionParser(usage = "usage: %prog [options]", # 使用示例
option_list = list(), # 参数列表
add_help_option = TRUE, # 是否自动添加-h参数
prog = NULL, # prog替代具体的字符串,默认是程序名
description = "", # 在usage语句和options语句之间为print_help打印的附加文本
epilogue = "") # 在options语句之后打印的print_help的附加文本
make_option(opt_str, # 参数的short-long flag;"-f --file"
action = NULL, # 具体存储到参数列表的值,store/store_true/store_false
type = NULL, # 填写参数的数据类型,"logical/integer/double"
dest = NULL, # 参数列表中具体存储的变量名;默认是opt_str的long flag
default = NULL, # 参数的默认值
help = "", # 参数的功能的介绍
metavar = NULL) # 提醒用户,该命令行参数所期待的参数
Example:
$ cat > test3.R
library(optparse)
# 描述参数的解析方式
option_list <- list(
make_option(c("-f", "--first"), type = "integer", default = 1,
action = "store", help = "This is first! [default %default]"),
make_option(c("-s", "--second"), type = "character", default = "ok",
action = "store", help = "This is second![default \"%default\"]"),
make_option(c("-t", "--third"), type = "logical", default = FALSE,
action = "store", help = "This is third! [default %default]"),
make_option(c("-r", "--run"), action = "store_true", default = FALSE,
dest = "verbose", help = "run this SAS code [default %default]")
)
# 解析参数
opt = parse_args(OptionParser(option_list = option_list,
usage = "Usage: %prog [options] \nDescription: This Script is a test for arguments!"))
print(opt)
运行脚本,查看帮助信息:
$ Rscript test3.R -h
Usage: test3.R [options]
Description: This Script is a test for arguments!
Options:
-f FIRST, --first=FIRST
This is first! [default 1]
-s SECOND, --second=SECOND
This is second![default "ok"]
-t THIRD, --third=THIRD
This is third! [default FALSE]
-r, --run
run this SAS code [default FALSE]
-h, --help
Show this help message and exit
查看默认参数:
$ Rscript test3.R
$first
[1] 1
$second
[1] "ok"
$third
[1] FALSE
$verbose
[1] FALSE
$help
[1] FALSE
提供参数值:
$ Rscript test3.R -f 1 -s "hello" -t TRUE -r
$first
[1] 1
$second
[1] "hello"
$third
[1] TRUE
$verbose
[1] TRUE
$help
[1] FALSE
欢迎评论交流~ 😊