- C++をRで使うとはどういうことか、というと…
- C++(Cも)として動いている何かがある
- それをRから使える動的ライブラリにして、
- それをRから呼び出せるようにRに接続して、
- Rから呼び出す関数を作り
- そして使う
- という段階を踏む
- 「C++(Cも)として動いている何かがある」、というのはRとは無関係にC++として動く・使える、ということ
- 「Rから使える動的ライブラリに」、というのは、R CMD SHLIBでコンパイルする、ということ。"hoge.so"(Windowsなら"hoge.dll")を作ること
- 「Rに接続」、というのは、Rもいろいろな動的ライブラリの塊として動いているので、その中から、「新しいライブラリを取り込む」ためには、既存のそれらとつなぐ必要がある。R内からdyn.load()でつなぎいれる
- 「Rから呼び出す関数」、とは、Rの中でのデータ型とC++のそれとは違うので、きちんと「R」からライブラリ関数を呼び出しつつ、Rのデータ型がうまくわたるように、データ型の細かい定義をし直しつつ、それらをRからC++への接続関数に渡す。この関数が.C()
- これを全部自前で書いてもよいけれど、面倒くさいところをまとめてやってくれるのが、Rcpp
- 単独のファイルしか扱わないけれど
- Rの型を大まかに意識して書けばよい状況でc++ファイルを書き、
- sourceCpp()に渡すと、
- 型がきちんとした仮ファイルを作って、それを動的ライブラリに変えて
- 動いているRにそのライブラリを接続し
- さらに、その中の関数を呼び出すR関数を型意識して書いてくれる
- その結果、RユーザはRの関数を使うように(型の意識が低いままに)使えるようになる
- さて。(Rtoolsを入れるとWindowsでもRのコマンドラインが回ってくれるから、WindowsでもLinux/Macとほぼ同じようにできる)
- こちらに「簡単にcをRで使う」という記事がある
- Windowsの場合には"hoge.dll"というライブラリファイルになるので少し変更する
- また、できはするけど表示がないのでちょっといじって、以下が、Windows環境でうまくいった
#include <stdio.h>
void hello(char** str)
{
if(str)
printf("Hello %s\n", *str);
}
R CMD SHLIB hello.c
dyn.load("hello.dll")
hello <- function(val) {
.C("hello", as.character(val))
}
hello("t")
> hello("t")
[[1]]
[1] "t"