【R基础】R脚本解析命令行参数

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

Python模块学习——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

欢迎评论交流~ 😊

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,061评论 6 523
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,407评论 3 404
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,275评论 0 368
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,084评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,091评论 6 400
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,555评论 1 315
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,914评论 3 429
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,900评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,438评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,470评论 3 346
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,596评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,187评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,932评论 3 340
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,361评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,511评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,163评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,671评论 2 366

推荐阅读更多精彩内容