| Top Page | プログラミング | R 自動化 目次 | 索引 | 前へ | 次へ |
※このページは,Perl や Ruby などのスクリプト言語から R を呼び出す際に 必要な情報を説明しています.こうした言語の知識がないと意味不明かも知れませんが, その場合にはそもそもここで書いた知識を使うことはないでしょう.
※実行環境としては Windows のコマンドプロンプトを想定していますが, Unix 系OS の仮想端末でもほぼ同様のことができるでしょう.
R での作業を自動化するにあたって,GUI (R の入出力ウィンドウ)での手作業が じゃまになることもあります. GUI を経由せず, Perl や Ruby といったスクリプト言語のプログラム中で R のプログラムの実行も制御できれば,さらに自動化の幅は広がるでしょう. C++ で開発したシミュレーションプログラムを動かしながら 計算結果をグラフ化していく一連の作業を,すべてスクリプト言語で自動化する といった使い方ができれば便利です.
Perl も Ruby も,コマンドプロンプト上で実行可能な命令(をあらわす文字列)を スクリプト中で実行する機能があります ( コマンドプロンプトの使い方については, WindowsでのPerlの実行のページでも簡単に説明しています ).
たとえば Perl では, コマンドプロンプトから入力する命令を,文字列として system という(Perl の) 関数に渡せば,Perl がその命令を OS に渡して実行させてくれます.
例を見てみましょう.Windows の コマンドプロンプトで ver と入力すると Windows のバージョンが表示されますが, 以下のような Perl のプログラムは,この命令を Perl のスクリプト中で 実行するものです.
system("ver")
上のような内容のファイル ver.pl を作り,コマンドプロンプトで
perl ver.pl
とすれば,たとえば私の環境だと
Microsoft Windows XP [Version 5.1.2600]
のようにWindows のバージョンが表示されます.
R のプログラムもコマンドプロンプトで動かせるなら, 命令をコマンドプロンプトで入力する代わりに sysmtem 関数に渡せば, Perl(あるいは Ruby でも同様)のプログラム中で R のプログラムを実行できます. 以下ではコマンドプロンプトで R のプログラムを実行する方法を説明します.
コマンドプロンプトで R を動かす方法はいくつかありますが,rscript.exe という プログラムを使うとパラメータも渡しやすくてよいようです. たとえば,以下のようにファイル名を順次生成する R のプログラム file_names.R が あるとします.
name <- "file" n.block <- 5 for (i in 1:n.block) { file <- sprintf("%s_%03d.txt", name, i) cat(file) # 画面に出力 cat("\n") # 改行コード } }
Rを起動した状態で,入力画面で
source('file_names.R')
と入力すると,以下のように文字列が表示されます.
file_001.txt file_002.txt file_003.txt file_004.txt file_005.txt
このプログラムを,コマンドラインから実行してみます. プログラムが置いてあるディレクトリをカレントにした状態で, 以下のように入力してみてください. コマンドプロンプトの画面に,上と同様に文字列が表示されるはずです.
rscript file_names.R
もし,「'rscript' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 などと表示されたら,R がインストールされているディレクトリが環境変数 PATH に 設定されていない可能性があります.対処法は, 環境変数 PATH Windows などの語で検索して調べてみてください.
R のプログラムの実行時に,パラメータを渡したいことがあります. たとえば,処理するべきファイルの名前をプログラム中に書込んでしまうのではなく, プログラムを呼び出すときにファイル名を指定する,とった状況などです.
rscript を使う場合,R のプログラムファイル名のあとに空白で区切って 何個でもパラメータを書くことができます.ここに書かれたパラメータは, R のプログラム中で commandArgs という関数を使って 知ることができます.
さきほどのファイル名生成プログラム file_names.R を以下のように変えてみます.
args <- commandArgs() # パラメータのベクトル # commandArgsが返すベクトルの1〜5番めの要素は,R のプログラム側では不要な要素(※) name <- args[6] # 6番めの要素が最初のパラメータ n.block <- args[7] # 7番めは2つめのパラメータ for (i in 1:n.block) { file <- sprintf("%s_%03d.txt", name, i) cat(file) # 画面に出力 cat("\n") # 改行コード } # ※ 1〜5番めの要素の内容は以下の通り. # [1] "C:\\Program Files\\R\\R-2.8.1\\bin\\Rterm.exe" # [2] "--slave" # [3] "--no-restore" # [4] "--file=file_names.R" # [5] "--args"
そして,以下のようにファイル名中の文字列(下の例だと foo)と, 通し番号を何番まで振るか(下の例だと 5まで)を指定してコマンドプロンプトで 実行させます.
rscript file_names.R foo 5
すると,以下のような文字列が表示されるはずです.
foo_001.txt foo_002.txt foo_003.txt foo_004.txt foo_005.txt
コマンドプロンプトで指定するパラメータをいろいろ変えて試してみてください. たしかにパラメータが R のプログラムに渡っています.
以上で,コマンドプロンプトでの R のプログラムの実行方法と, その際のパラメータの渡し方が分かりました. Perl 使いや Ruby 使いにとっては,これで作業の自動化の幅がますます広がることと思います.