背景
Rはインタラクティブにプログラミングできるのが魅力ですが、バッチ処理などコマンドライン上で引数を受け取ってスクリプトを実行したいときもあります。
環境
PC: MacBook Pro 2020
OS: macOS Catalina (10.15.5)
shell: zsh (5.7.1)
R: 4.0.2 (2020-06-22)
方法
下記のように入力すればコマンドライン上でRのスクリプトを実行できます。
Rscript Rのスクリプトファイル(.R) 引数1 引数2 引数3…
具体例として、2引数を受け取って和と積を計算して表示するCalculation.Rを作成しました。
# Calculation.R
# 引数の取得
num1 <- commandArgs(trailingOnly = TRUE)[1]
num2 <- commandArgs(trailingOnly = TRUE)[2]
# 和と積の計算
sum <- as.numeric(num1) + as.numeric(num2)
product <- as.numeric(num1) * as.numeric(num2)
# コマンドライン上に表示
cat(paste("Sum is ", sum, ".\nProduct is ", product, ".\n", sep = ""))
実行してみます。
Rscript Calculation.R 2 4
Sum is 6.
Product is 8.
2と4を受け取って和の6と積の8が出力されました。
注意点
1. 引数は文字列ベクトルとして受け取られる。
引数がどのように受け取られるのか確認するため、下記のArgsClass.Rを実行してみます。
# ArgsClass.R
# 引数の取得
args <- commandArgs(trailingOnly = TRUE)
args
class(args)
Rscript ArgsClass.R 2 4
[1] "2" "4"
[1] "character"
長さ2の文字列ベクトルであることが分かります。そのため、Calculation.Rでは添え字で1つ目の引数と2つ目の引数を取得し(2・3行目)、as.numeric()で数値に型変換しています(6・7行目)。
2. commandArgs()で「trailingOnly = TRUE」を指定する
commandArgs()で引数を取得していますが、このときオプションで「trailingOnly = TRUE」を指定する必要があります。
commandArgs()のドキュメントには
Arguments
trailingOnly logical. Should only arguments after --args be returned?
とありますが、イマイチよく分からないので「trailingOnly = FALSE」を指定して比較してみます。
# trailingOnlyF.R
# 引数の取得
args <- commandArgs(trailingOnly = FALSE)
args
class(args)
Rscript trailingOnlyF.R 2 4
[1] "/Library/Frameworks/R.framework/Resources/bin/exec/R"
[2] "--no-echo"
[3] "--no-restore"
[4] "--file=trailingOnlyF.R"
[5] "--args"
[6] "24"
[1] "character"
「trailingOnly = FALSE」を指定すると、引数として入力した「2 4」以外にパスやファイル名なども引数として受け取られていることが分かります。
すなわち、「trailingOnly = TRUE」はコマンドライン上で入力した引数(--argsとして引き渡された引数)のみを返すオプションになります。