AcreMaker
RをUNIX上でログアウトした後も計算させる方法(バッチ処理)

Rによる統計解析は、時として膨大な時間がかかる場合があります。
そのような計算のために、計算サーバーを立ち上げて計算などを行ってる方もいると思いますが、
サーバーの設定では、Teratermなどのターミナルエミュレーター(計算サーバーを遠隔操作するソフト)が、
数時間放置すると自動でログアウトしてしまうことがあります。

今回は、ログアウトした後もサーバー上で計算を続ける方法を紹介します(いわゆるバッチ処理)。
これができると、サーバーにオーバーナイトで計算をさせて、翌日計算結果を吟味する
といったこともすることができます。


nohup R --vanilla --slave < hoge.r > hoge.txt
      (--save)


UNIX言語において、nohupというコマンドがログアウトしても実行し続けるようにするコマンドです。
nohupの後ろのRはUNIX上でRを起動させるコマンド、その後ろに引数をいくつか与えることができます。

--vanilla : Rを何のオブジェクトもない状態で起動する。
保存しているデータが邪魔をして正しい結果がでない可能性が0でない場合、
つまり偶然保存していたオブジェクトが計算結果に不具合をもたらしたということがあり得ることを
考えると、--vanillaで起動するのが望ましいです。
もちろん中にあらかじめ保存していたデータなどを用いる場合は--vanillaによる起動をするとエラーを
起こします。

--save : --vanillaの逆で今までのオブジェクトを残したままRを起動する。
中にあらかじめ保存していたデータなどを用いる場合は--saveを引数として与えましょう。
--vanillaや--saveを引数として省略した場合は、Defaultでこちらの--saveが与えられるようですが
念のため入れておくといいかと。

--slave : 標準出力への文字の出力を抑制します。

hoge.r : 読み込ませるRのソース。
パイプをつけることによって自身が作成したソースをRにて実行させます。< を必ずつけましょう。
< とhoge.txtとつけることにより、Rの標準画面に表示されるものをログとして保存できます。
こちらはログをとる必要がない場合は省略できます。--slaveを引数としてつけておくと、
この部分の出力が抑制されます。

また、バッチ処理をするにあたって、便利な関数がcommandArgsとget関数です。
例えば、以下のようなソースを作成した時


#test.r 以下、ソースの中身

d <- get(commandArgs[5])
write.csv(d,file="test.csv")
q(save="yes")


そして、このソースを次のように実行します。


nohup R --save --slave --args test <test.r


と、した時、以下のようにプログラムが実行されます。
まずcommandArgs関数はRを実行した時の引数をベクトルとして表示する関数です。
今回の場合はもしcommandArgs()をR内で実行すると次のように表示されてるはずです。


> commandArgs( )
[1] "/usr/local/lib64/R/bin/exec/R" "--save"
[3] "--slave" "--args"
[5] "test"


はじめの[1]には起動したR自身(Rのインストール先によって表示されるものは若干異なります)、
続いて与えた引数が与えた順に表示されます。
なので、例えば--saveと--slaveの順番を逆にすると、commandArgs()の表示の順番も逆になります。
--argsは引数を与えるための引数であり、--args testとした場合、Rに対してtestは引数ですよ、
と知らせることになります。

上のプログラムではcommandArgs[5]で、"test"を指定してます。さらにこれをget関数に放り込んでいます。
get関数は"test"という名前のオブジェクトを指定してくれる関数です。
commandArgs[5]のベクトルに保存されている"test"はあくまで、"test"という文字列です。
そこでget関数でtestという名前の関数のことを示していると変換する必要があります。
今回のプログラムでは、さらにそのtestというオブジェクトをcsvとして書きだしています。

最後に念のためq関数でRを終了させておきましょう。ただ単にq()としておくと、
(ログアウトしているにもかかわらず)R内部でsaveをするかどうかたずねてくる場合があります。
なので、saveする場合はq(save="yes")、しない場合はq(save="no")としておくといいでしょう。

--args を利用すると、あらかじめ作成していたtest.rの一部だけを変更することができます。
例えば、以下のように、


arg <- commandArgs( )[5]
file.name <- sprintf("data%s",arg)
hoge <- .....
#hogeに色々解析した結果を入れる
write.csv(hoge,file=file.name)
q(save="no")


と、したtest.rを作り

nohup R --vanilla --slave --args 091221 <test.r


と、実行するとdata091211.csvと、今日の日付が入ったファイルにて保存がされます。
他にも、解析手法は同じで解析するデータがだけが違うなど、一部だけ変更したい場合に便利です。


公開日 : 12月21日