
R --vanilla --slave < mds.R
mds.R というRファイルを実行するには上記のように入力する。mds.R は自身と同一階層にある dissim.data というファイルを R に読み込んで多次元尺度構成法による分析を行ない、その結果を表として出力しつつグラフも PDF形式ファイルとして作成するという内容である。
とりあえず実行した結果は GUI 版の R で mds.R を実行したのと(Rplots.ps という余分なファイルが発生している以外は)表面上同じ結果になり、期待したファイル類を新たに作成できてはいた。エラーメッセージとしては「null device 1」というのが出ていたので確認してみると、作表はうまくいっていたが作図ファイルは空であった。
一方予想外に出現した Rplots.ps を開くと作図結果が出力されていたが、続けて hclust.R(mds.R が作成した表を読み込んでクラスター分析を実行、作表と作図ファイルを出力)を実行すると作図内容が上書き更新されてしまった。Rplots.ps は GUI 版で実行したときに一時的に作図が表示される Quartz デバイス に該当するようである。
前項の内容を system関数を使って実行したところ、更に問題が生じた。
system ("R --vanilla --slave < ./data/mds.R");
mds.R は CGI スクリプトよりも階層が一つ下の data というディレクトリにあるので上記のように書いた。これを含む CGIスクリプトを実行したところ、途中でエラーを吐いて止まったりはしなかったが、分析結果の作表もグラフの作画もされなかった。この過程で R が返してきたエラーメッセージはファイルの形で CGI スクリプトが置いてあるディレクトリに作成されていた。
それによると mds.R は実行された形跡はあるが、ファイルの読み込みなどには失敗したようである。以下こうした問題の対策について述べる。
結論からいうと CGI スクリプトが置いてあるディレクトリにあると看做されたと解釈するしかない。これは言い換えれば ./data/mds.R が ./mds.R と認識されたということである。
このため mds.R 内で dissim.data の位置を記述した部分の意味が変わってしまってエラーを起こしたようだ。つまり mds.R が自身のある data フォルダ内で dissim.data を探すように記述した部分が、その一つ上の階層で dissim.data を探すという意味に受け取られ、読み込むべきファイルを見失うことになっていたのである。
よって、mds.R 内でファイルの読み込みや出力について記述してあった部分を以下のように直す事で期待した動作をさせられる。コメントアウトした部分は修正前のもので、比較のために示した。
# X <- read.table("dissim.data", header=T)
X <- read.table("./data/dissim.data", header=T)
# write.table(dissim, file="mdsout.data", sep="\t", row.names=T, col.names=F, quote=F)
write.table(dissim, file="./data/mdsout.data", sep="\t", row.names=T, col.names=F, quote=F)
しかし上記の様にRファイルの中身を改変してしまうと、今度は GUI 版の R で実行したときにエラーが出てしまうことになる。ターミナルで実行する場合と同様に、source() で実行する際の作業ディレクトリは通常 mds.R があるディレクトリであるため、dissim.data の位置は ./data/dissim.data ではなく ./dissim.data と記述されていなければならない。
この問題は結局、 GUI 版 R 用と batch mode 用の二種類のRファイルを作成して後者のみを CGI スクリプト上で実行するという方法で解決した。
ところで処理過程で出力される作表結果ファイルの内容は、上記二種のRファイルで同じなのでファイル名も同じで構わないはずである。しかし実際にやってみると GUI版 R で実行したときに下記のようなエラーメッセージが出てしまう。
以下にエラーfile(file, ifelse(append, "a", "w")) :
コネクションを開くことができません
追加情報: Warning message:
ファイル 'mdsout.data' を開くことができません, 理由は'Permission denied'です
作表結果を出力するときに(CGIスクリプト実行時に作成された)既存のファイルを上書き更新しようとするのだが権限がないとして拒否されているのである。このエラーが出て途中で止まってしまうとしても作図工程がそれ以前のパートに記述してあれば作図結果ファイルは得られる。しかし致命的ではないにせよ、これは明らかに不具合である。
また、作業ディレクトリを CGI スクリプトが置いてある階層にして batch mode 用ファイルを指定するという方法を使えば GUI 版 R からでも実行可能なのだが、dissim.data 以外のファイルを予め削除しておかないと上記の例と同様のエラーが出て作業は途中で止まってしまう。こうした問題を回避するには二種類のファイルで処理中に出力するファイル名を異なったものにしておく必要があるだろう。
分析結果を表として出力する問題については上述の方法で一応解決したが、作図の問題は現時点では全く解決できていない。主なエラーとしては先述したものの他に下記のようなものが出る。
unable to start device PostScript
おそらく作図用デバイスの操作に失敗しているのだと思われる。対処法が簡単に見つかるのかどうかよくわからないため、この問題は棚上げすることとした。
作図機能を省いて多次元尺度構成法とクラスター分析用の Rファイルをひとまとめにし、これを batch mode で動かすことにした。R を使った処理で最終的に得られた「語彙項目にクラスター番号が振られた表」は、Perlを使って「語彙項目をクラスター分けした表」に再構成する。
batch mode で作図が(少なくとも現時点では)できないのは残念だが、対象テキストファイルに含まれる語彙項目をクラスター分けする段階までスクリプトで一括処理できるようになったのは大きな利点である。
X <- read.table("./data/dissim.data", header=T)
dissim <- cmdscale(X)
write.table(dissim, file="./data/mdsout.data", sep="\t", row.names=T, col.names=F, quote=F)
Y <- read.table("./data/mdsout.data")
df <- data.frame(Y, row.names=T)
hc <- hclust(dist(df), "ward")
plot(hc, hang=-1)
hc2 <- cutree(hc, k=5)
write.table(hc2, file="./data/hc.data", sep="\t", row.names=T, col.names=F, quote=F)
batch mode については以下のサイトを参考にした。
>> RjpWiki
この件に関してはまだまだあまりにもよくわからないことが多い。
Copyright(c)2005-2012 ccoe@mac.com Allrights reserved.