金魚亭日常

読書,ガジェット,競技プログラミング

R でコマンドライン引数を扱う

これ

stackoverflow.com

に回答したときに,コマンドライン引数の扱いについて調べた.

  • スペースを含む引数は "--arg=hoge fuga" のように全体をクオートで囲う
    • --args='hoge fuga とするとスペースで切られる
  • optparseを使うと Python っぽく書ける
    • 自作関数を作らなくていいし,変な入力もチェックできる
    • コマンドライン引数をとってくる部分は commandArgs() なので,スペースを含む引数の指定の仕方は同じ

github.com

  • 他にもいくつかパッケージがあるようだ

optparse を使わない

質問した人はこんな感じにコマンドライン引数を扱っていた.

  • args_test.r
args <- commandArgs(trailingOnly=T)
parseArgs <- function(x) strsplit(sub("^--", "", x), "=")
print(parseArgs(args))

実行

> r --slave --file=args_test.r --args --title=TITLE "--author=AUTHOR NAME"

# [[1]]
# [1] "title" "TITLE"

# [[2]]
# [1] "author"      "AUTHOR NAME"

これでもエラーにならない

> r --slave --file=args_test.r --args --title=TITLE --author='AUTHOR NAME'
# [[1]]
# [1] "title" "TITLE"
# 
# [[2]]
# [1] "author"  "'AUTHOR"
# 
# [[3]]
# [1] "NAME'"

optparse を使う

  • args_test2.r
suppressPackageStartupMessages(library("optparse"))
parser <- OptionParser()
parser <- add_option(parser, c("--title"), action="store", default="TITLE", help="Title")
parser <- add_option(parser, c("--author"), action="store", default="AUTHOR NAME", help="Author")
print(parse_args(parser))

実行

  • --help が付く
> r --slave --file=args_test2.r --args --title=TITLE "--author=AUTHOR NAME"

# package 'optparse' was built under R version 3.3.3
# $help
# [1] FALSE
# 
# $title
# [1] "TITLE"
# 
# $author
# [1] "AUTHOR NAME"

これはエラー

> r --slave --file=args_test2.r --args --title=TITLE --author='AUTHOR NAME'

# Error in getopt(spec = spec, opt = args) :
#   "NAME'" is not a valid option, or does not support an argument
# Calls: print -> parse_args -> getopt
# Execution halted