Rってめっちゃ検索しにくくね!?

タイトルはただの愚痴です。
情報検索能力が著しく低い身としては、もう少し名前、どうにかならなかったんですかと2、3分ほど問い詰めたい思いではありますが、まあそれもいいでしょう。
どうでもいいことです(主にこの文章が)。

さて。
タイトルの通り、今回はRのplotに関する個人メモですね。
グラフを書く際などに、gnuplotを用いるという手法が偉い人たちの間ではメジャーなんでしょうが、僕のような怠惰なライトユーザーには、彼は敷居が高い感じです。
ライトと怠惰、どちらが原因なのかという疑問を感じた人は、お疲れ気味のようなのでお体を大切に。
で、特に今回はRscriptを用いた例をメモります。

使用イメージ:

まずは、どういう使い方がしたかったかというお話から。
まず、下記のようなデータファイルがあったとしましょう。

5.049930979133517
6.736440649585864
6.8435364429119945
9.879380973488646
......

これをグラフにして表示したい場合。
今回は、まあ折れ線グラフを想定しましょう。出力形式はEPSですよ。

Why you use Rscript?:

Rscriptはコマンド名です。
Ubuntu、ならびにFreeBSD環境においてはRをインストールすればお目にかかれると思います。
名前から連想される通り、これによってRのスクリプトを実行できます。
では、なぜスクリプトなんかが必要なのかと言うと、

  • フォーマットは同じなんだけど、データが何種類かあって、それぞれ自動処理したい。
  • データの生成から、グラフのプロットまでを自動化したい。

など、つまり単純な処理フローを自動化したいという思いからです。
まあ、この辺シェルスクリプトと同じですよね。
そんな訳で。
Rscriptで実行するスクリプトファイルの例を次に挙げます。

スクリプト

さっきのデータを単純にグラフとしてEPS形式で吐き出させるなら、という体でお送りします。
データファイルがdata.datというファイルで保存されているとお考えください。
まずは、スクリプトから。

args <- commandArgs()
(x <- scan(args[6]))
x11()
plot(x,xlim=c(400,700),ylim=c(0,30),type="l",ann=F,axes=FALSE)
dev.copy(device=x11,width=10,height=5)
dev.copy2eps(file=args[7])
dev.off(dev.prev())
dev.off()

名前は……data-plot.Rとでもしておけばいいんじゃないかと思ってます。拡張子なんて、対した問題ではないですので(少なくとも、ここにおいては)。
次に、実行方法。スクリプト名"data-plot.R"、データファイル"data.dat"、出力ファイル名"result.eps"とします。

% Rscript data-plot.R data.dat result.eps

シェル上でこのように実行しますと、まあresult.epsが出力されるというスクリプトです。

さて、Rの記法や関数のきめ細やかな説明は割愛します。それらをまとめて下さっている、僕なんかより優秀な方々が世の中には星の数ほど、人の数だけいらっしゃるのです。(つまり……)
そういうことですから、ここでは概要だけを列記しときます。

  • commandArgs()で実行時引数を格納します。
  • scan(args[6])でデータファイルからデータを読み取っていますが、なぜ6かは4とか5とかをご自分で試して頂けたら自明です。結論から言うと、args[6]はdata.datという文字列が格納されています。
  • EPSに出力する肝となるのが、x11()やdev.*の辺りです。出力そのものは、dev.copy2epsで行っています。この辺も、詳しくは触れません。それやってると疲れます。
  • dev.offは……まあ、開いたら閉じるんです。最後はそういうことです。

まあ、動かして頂ければ、それとなく雰囲気はつかめるかと思います。
メモとして重要なのは、形であって細部ではないので。

応用(グラフの重ね合わせ):

最後に、グラフを重ね合わせる場合の例を載せておきます。これについては、一切の説明を割愛します。
ま、馬鹿が知った口を聞くより万倍マシでしょう。

args <- commandArgs()
(x <- scan(args[6]))
(y <- scan(args[7]))
x11()
plot(x,ylim=c(0,1e-1),type="l",ann=F,axes=FALSE,lty=2)
par(new=T)
plot(y,ylim=c(0,1e-1),type="l",ann=F)
dev.copy(device=x11,width=10,height=5)
dev.copy2eps(file=args[8])
dev.off(dev.prev())
dev.off()

実行方法。

Rscript freq-plot.R male-x1.dat female-x1.dat x1.eps

みたいな?