読者です 読者をやめる 読者になる 読者になる

MacでRcppを動かしたい

珍しく続けて更新。
R言語上級ハンドブックを使った勉強会をしてまして、躓いたところを補完しておきます。

環境

MacOSX10.9 Marvericks、Xcode 5.0.1の上でThe R Project for Statistical Computingで配布されているR 3.0.2 binary for Mac OS Xを動かしてる。

C++のコードをコンパイルしようとするとエラー

Chapter1 section13 「S4/Refference ClassをRcppで生成する」ではC++のソースをコンパイルしてRで使おうっていう章でテキストは以下のような流れ。

> install.packages(c("inline", "Rcpp"))
> library(inline)
> library(Rcpp)
> inc <- '
using namespace Rcpp;
using namespace std;
class Student {
    :(中略)
}
'
> mod_std <- cxxfunction(signature(),plugin="Rcpp",includes=inc)
> mod_student <- Module("mod_student", getDynLib(mod_std))
> Student <- mod_student$Student
> student1 <- new (Student, 18, "Taro")

incにコードが入ってて、それをcxxfunctionでコンパイルしたい。
だがしかし、cxxfunctionを実行すると、

以下にエラー dyn.load(libLFile) : 
   共有ライブラリ '/var/folders/9r/x2b16sds2l30w0tds8p29k740000gn/T//RtmpbtB1sk/filed517926b08c.so' を読み込めません: 
  dlopen(/var/folders/9r/x2b16sds2l30w0tds8p29k740000gn/T//RtmpbtB1sk/filed517926b08c.so, 6): Symbol not found: __Z8demangleRKNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE
  Referenced from: /var/folders/9r/x2b16sds2l30w0tds8p29k740000gn/T//RtmpbtB1sk/filed517926b08c.so
  Expected in: flat namespace
 in /var/folders/9r/x2b16sds2l30w0tds8p29k740000gn/T//RtmpbtB1sk/filed517926b08c.so

なんかのダイナミックライブラリが読み込めてないって怒られる。
調べてみたところ、Rをコンパイルした環境と使ってる環境が違うんじゃないかって話で、具体的にはRはlvm-gcc 4.2を使ってコンパイルされてて、MacOSXコンパイラがclang++なのが問題っぽい。

Rをコンパイルすればいい

手っ取り早く解決するためにRをコンパイルすることにした。とはいってもソース落としてきたりするのは面倒なのでhomebrew*1で一発解決。

$ brew install R

このRは/usr/local/bin/にインストールされる*2。先にあったバイナリ版のRは/usr/bin/Rにシンボリックリンクがあるのでこれを消して新しくbrew版のRのリンクを置いておく。これでRStudioからも見える。

$ rm /usr/bin/R
$ ln -s /usr/local/bin/R /usr/bin

これで無事にC++のコードをコンパイルすることができた。

Windows環境で出るエラーについて

以下のような別のエラーが出てて

Error in compileCode(f, code, language = language, verbose = verbose) : 
  Compilation ERROR, function(s)/method(s) not created! 
In addition: Warning message:
running command 'C:/PROGRA~1/R/R-30~1.2/bin/x64/R CMD SHLIB file156c720a4197.cpp 2> file156c720a4197.cpp.err.txt' had status 1

ざっと調べたところfortranコンパイラが足りないとかなんとか。とりあえずいろいろ導入してくれるRTools(http://cran.r-project.org/bin/windows/Rtools/)っていうのを入れるといいらしい。Rcpp・inlineパッケージを使ってC++とRを連携させる - My Life as a Mock Quantに詳しく書いてあったので見てみるといいかもしれません。

【おまけ】RStudioでC++コードを簡単にコンパイルする

  1. あらかじめRcppとinlineパッケージを読み込んでおく
  2. 左上の新規作成アイコンの右の小さい矢印からプルダウンメニューを開いてC++Fileを選択
  3. 開いたウインドウにコードを入力して保存(名前つける。例えばhoge.cpp)
  4. コンソールからsourceCpp("hoge.cpp")を実行
  5. 使える

*1:homebrewのインストールと使い方はHomebrewの使い方 - maruko2 Note.とかを参考に。

*2:本当は/usr/local/Cellar/r/3.0.2/bin/Rにあるけどわかりやすいからこっちで