qsub などで R コードを実行するときは R のバッチモードを利用する

R バッチモード

R はバッチモードにより実行することができる。バッチモードを利用することで、時間のかかる大規模な処理をあらかじめファイルに書いてから qsub などで実行できるようになる。また、Perl や Python などといったプログラミングからも R を呼び出して実行したりすることもできるようになる。

コマンドラインでの実行

コマンドライン上で R にスクリプトファイルを読み込ませて、処理を行う際に --slave--vanilla オプションを付ける。

R CMD BATCH --slave --vanilla  script.R script.R.log

引数の受け渡し

バッチモードで外部から引数を与えるときは、--args 引数を文字列として与える。

R CMD BATCH --slave --vanilla '--args x=10 y=20' script.R script.R.log

このとき、script.R は以下のように書くと、外部から与えられた x および y を受け取ることができる。

args <- commandArgs(TRUE)

if (length(args) == 2) {
    for(i in 1:length(args)){
        eval(parse(text = args))
    }
} else {
    stop()
}

z <- x + y
z

Perl から R 呼び出して実行

Perl から R を呼び出して実行する場合はバッチモードを利用する。スクリプトファイルを一度作成してから実行させる。

use strict;

# Rコードを作成
my $code = <<EOF;
    a <- 10
    b <- 10
    x <- a + b
    write.table(x, file = "result.txt")
EOF

# Rコードをファイルに保存
open(my $fh, '>', "./exe_script.R") or die;
print $fh $code;
close($fh);

# Rコードを実行
system("R CMD BATCH --slave --vanilla ./exe_script.R ./exe_script.R.log");