niszetの日記

10年目エンジニアが最近勉強したことを忘れないようにメモをする

rsoundが動いたときの記録。

R力が足らない…

さて、例のrsoundですが私の環境ではしばらくの間、うまく動いていませんでした。
今は動いているものの、うまく更新が出来ず…。とりあえず動いているので触らないことにしています。

さて、この記事自体はずいぶん前に下書きを書いていたのですが、公開にしていないことに気づいて加筆訂正して公開しようと思った次第。

rsoundについて

rsoundはCsoundをRから呼ぶためのライブラリです。

notchained.hatenablog.com

github.com

Csoundはcppで書かれているので、Rcppを使ってCsoundのライブラリを呼ぶ形で作られているのですが、このrsound.dllを作るところで詰んでました。

これは主に僕のRcpp/cppまわりの理解が足りていなかったのですが、反省も兼ねて記録を残しておきます。

Rcppについて

最初は何が問題だったのかわからなかったので、Rcpp自体を勉強することにしました。
rsoundは公開時期がちょっと昔なので、Rtoolsのバージョンupに起因する可能性があったためです。Yutaniさんにご指摘いただきました。 調べた結果、Rtoolsの環境周りはシロっぽいのでした。このとき参考にした本やサイトなどを列挙しておきます。

全部を理解できたわけではないのですが、津駄さんのこの資料がまとまっていて読みやすいと思います。

www.slideshare.net

RcppはAoRPにも載っていますが、分量的には少ないですね。 www.oreilly.co.jp

R言語徹底解説もチラ見してみました。まだ全然読んでない…。 www.kyoritsu-pub.co.jp

あとはパーフェクトRでしょうか。この本、情報量がかなりあるんですが僕はまだあまり読めていません… gihyo.jp

日本語で読めるというのは、最初のとっかかりの時点では重要なので、こういった情報が沢山手に入るのはRの強みですね。

Rcppまわりのトラブルをネットで調べた

一時期、rstanを導入するブーム?がありましたが、そのときに結構な方が色々ハマっていたようです。その時の記録も参考にしました。
結果、これもシロだったのですが。

こちらのリンク集がかなり広範囲に渡っているので、今後お世話になりそうです。 須通り_統計_C++は未経験だけどRcppで開発したい!(1) 環境構築編

中でもこちらは後に書くとおり、Sys.setenvで解決したので参考になりました。

Rcpp 俺様備忘録

こちらも。Macに限らず、です。 suryu.me

ビルドの方法について

最初、Rcpp::sourceCppでビルドしようとしていましたが、うまくいかない。 パッケージ開発入門を読むと、Build&Reloadを使うと良いと書いてあるのでそれに従う。これはRstudioのショートカットキーとしてCtrl+Shift+Bでもできますね。ショートカットキー便利です。覚えましょう。

www.oreilly.co.jp

RStudio (非公式日本語版)

g++のパスとバージョンについて(無罪だった)

私はmingwが動いている環境なので、whichでg++を探してみましたが、問題がなかった(ほかに入っているものもバージョンは同じ) 色々入れるとPATHが頻繁に書き換わるので、今何を参照しているのかはちゃんと見た方が良いですね…。

tjo.hatenablog.com

ファイルパスに空白が入るのはダメ?

これは結局わからず。C直下にCsoundを入れることにしましたが、少なくともこれだけではダメでしたので。たぶん関係ない。

コンパイル時のLとIのオプションについて

私の場合はこれが原因でした。
Rcppはsrc/Makevars にファイルがあればコレに書かれた設定を読んで実行されますが、このオプション周りが良くなかったようです。

最終的にはSys.setenvを使用して以下のように設定をしました。

> Sys.setenv("PKG_LIBS"="-Lc:/Csound6_x64/bin/ -lcsound64 -Lc:/Csound6_x64/bin/ -lcsnd6")
> Sys.setenv("PKG_CXXFLAGS"='-Ic:/Csound6_x64/include')

これでようやく動いたのでした。
Rcppの文法とかではなくて、環境変数?とかオプションまわりだったのでなかなか初学者には厳しい戦いでした…

なんだかリンク集になってしまいましたが、いつか誰かの何かに役に立つと良いなぁ…(当時の自分に見せたい。笑)