統計解析 Rを使い始めた

とりあえずさわってみる

 RはC++と相互運用できる上に、ファイナンス等ではかなりメジャーな存在なので使い始めてみた。以下使用感とかC++使いから見た上での不満とか。

  • パッケージに存在している関数と同名の関数を自作しても警告もエラーも出ない。
  • ベクトル、行列、リストの操作にはすごくマニアックなものがあり、覚えるのが鬱なのでスルー。順次思い出しながら使うぐらいでいいかも。C++におけるbind的なインターフェイスが多い。
  • オブジェクト生成時に「属性」なるものが自動的に作成され、それをあとから変更することで、オブジェクトを強制的に他の型のオブジェクトにできる。例えば4次元ベクトルを2x2行列に変換できる。できない場合もあるのかもしれないが、まだ知らない。
  • 引数の名前を指定しながら関数を呼ぶと、引数の順序を気にせず関数を呼べる仕様なのだが、バグや混乱の温床のようにしか見えない。まぁ便利だと思う人には便利なのだろう。
  • YahooやGoogleから過去のチャートデータが引っ張ってこれるライブラリが充実しているっぽいので良い。
  • 数値計算系のパッケージはデフォルトでそれなりに揃っているっぽい。速度は期待できるのか微妙。Rで繰り返し系アルゴリズムを実装すると遅くなることが多いという情報もよく見かける。
  • PostgreSQLへクエリーを送るパッケージもある。

 備えている機能自体は良いが、C++使いから言わせて貰えば言語仕様がグロい。やっぱり型やインターフェイスに厳しく、ことあるごとにエラーや警告を出す言語仕様って良い。R言語を使うために困難が生じることはないだろうが、なんか使っててキモい。こんな奇妙な使い勝手なら、別にC++ライクな仕様でいいじゃんと思ってしまうわけだが、これはC++使いの病だろうか。

 どのへんがグロいの?ということなのだが、例としてあげると、複合式以外でのif-elseブロックの書き方に以下のような制約がある。

>if(a>=0){
+ if (a == 0) b <- "zero"
+ elseb <- a //エラー
+}
+elseb <- -a //OK
  上記構文は複合式や関数ブロック内部では使える。
 次に、演算子オーバーロードのような機能もあるわけだが、その演算子の記述方法がグロい。RにはC/C++等のようなインクリメント演算子+=、デクリメント演算子-=がデフォルトではないのだが、定義できる。
 "%+=%" <- function(x, y)  x  <<- x+y
などと定義し、
 (x %+=% 2)
という風に使う。いやーグロいですね。演算子のために4つも文字打つんですかそうですか。
 次に、関数はreturn()を呼ぶことで値を返し、関数も終了してスコープを抜けるわけだが、return()がなくても複合文の最後の式の値が関数の返り値になる。グロいね。returnが予約語ではなく、return()関数となっているところもグロい。
 

RとC++の相互運用

 Rでは、RからC++ライブラリを読み込んで使ったり、C++からRにスクリプトやデータを渡して結果を受け取ったりできる。これにはRcppとRInsideパッケージが必要であり、インストール時に欠けているものはエラーと同時に不足パッケージ情報が出る。Linux環境であれば、不足しているライブラリ等の情報も出るので、インストールシステムでその都度入れれば良い。ここではFedora21(64bit環境)を使っているのでyumrpmになる。

 これらのパッケージをインストールすると、/usr/include/Rや/usr/lib64/R以下にインクルードファイルやシェアードオブジェクト(WindowsでいうDLLみたいなもん)が入っている。それらをC++で使うためには、開発環境にもよるが、まずはLD_SHARED_LIBLARYに.soへのパスを設定し、IDEにおいて作成したプロジェクトでインクルードファイルの検索先等を設定する。リンカーオプションは-lR -lRInsideで良いようだ。IDEを使わない場合はCPLUS_INCLUDE_PATHなどへパスを設定すると良いだろう。しかし、相当限られた環境であるなど、やむを得ない場合以外でVimmerになる必要もないだろう。Vimmerとは、Vimツールチェインを使ってゴリゴリやる人。これはこれで使い勝手が良い場合も多いので別に否定しているわけではない。

 とりあえずサンプルを動かしてみたが、正常に試せた。GUIや高速な処理を一部C++から行いたい場合には便利だろう。