Rスクリプトをパラメタを変えながら大量にバッチ実行したい時などはRスクリプトで実行時引数(コマンドライン引数)を取れるようにしておくと便利です。
例えば、処理対象のファイル名とパラメタを実行時引数として取れるようにしておくと同じデータをパラメタを0.01〜0.03に変えながら実行するといった処理を
Rscript program.R data.csv 0.01 Rscript program.R data.csv 0.02 Rscript program.R data.csv 0.03
と簡単に処理できるようになります。この記事ではRスクリプトで実行時引数を取得する方法を紹介します。
実行時引数の取得方法
R言語では実行時引数を取得する方法としてcommandArgs関数が用意されており、
commandArgs(trailingOnly = T)
とすると実行時引数を文字列配列として取得できます。よく忘れてしまうのがtrailingOnlyオプションで「trailingOnlyオプションをTrue」にしておかないと余分な引数まで取れてしまいます。このオプションの仕様・挙動が知りたい方は記事下部の「trailingOnlyオプションの意味」を参照ください。
Rスクリプトサンプル
実行時にファイル名(デフォルト値: “sample.csv”)と2つの数値パラメタp, q(デフォルト値は1, 2)をとるRスクリプトは以下になります。
なお、Rのterminal利用時など実行時引数がない場合も動くように実行時引数が足りない場合はデフォルト値を使うようにしています。
args <- commandArgs(trailingOnly = T) # 指定されていないオプションはデフォルト値を設定 default_args <- c("sample.csv", "1", "2") # デフォルト値定義 default_flg <- is.na(args[1:3]) args[default_flg] <- default_args[default_flg] # ファイル名、パラメタを設定 file_name <- args[1] p <- as.numeric(args[2]) q <- as.numeric(args[3]) # 設定内容を出力 message(paste("file_name = ", file_name, sep="")) message(paste("p = ", p, sep="")) message(paste("q = ", q, sep=""))
commandArgsは実行時引数を文字列として保持しているので数値として扱いたい場合はas.numericやas.integerで変換するようにしましょう。
このスクリプトをcommand_args.Rと保存してそのまま実行すると
$ Rscript command_args.R file_name = sample.csv p = 1 q = 2
とデフォルト値が設定され、実行時に引数を与えると
$ Rscript command_args.R data.csv 2 3 file_name = data.csv p = 2 q = 3
と与えた引数が反映されていることがわかります。
trailingOnlyオプションの意味
commandArgs関数の仕様は以下になっています。
- 関数名:commandArgs
- 引数
- trailingOnly: –argsオプション以降を返すか(デフォルト: False)
- 戻り値:実行時引数の文字列配列
これだけ読んでもtrailingOnlyオプションの意味がよく分からないのですが、Rscriptコマンドで
$ Rscript command_args.R data.csv
とスクリプトを起動をした場合、内部的には
$ R --file=command_args.R --slave --no-restore --args data.csv
と
- バッチ起動用のオプション(–file, –slave, –no-restore)
- スクリプトに渡す引数(–args)を示すオプション
などがRに渡されています。
trailingOnlyオプションがデフォルトのFalseだとRを起動した時の実行時引数がすべてcommandArgs関数から返ってくるため
- Rプログラムのパス
- –slave, –no-restore, –fileなどの起動時オプション
などRのバージョンや環境に依存した実行時引数もcommandArgs関数の結果に含まれてしまいます。trailingOnlyオプションをTrueとするとスクリプトに渡した引数(R起動時に–argsとして渡された引数)のみを取得することができます。