C/C++ so/dllのR読み込み

  • 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環境でうまくいった
    • R CMD SHLIB
    • dyn.load()
#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))
  #NULL これがNULLだとなんか表示がなかった…???不明???
}

hello("t")
> hello("t")
[[1]]
[1] "t"
  • そもそもライブラリって、はこちら