Visual C++ 2010 からR.dll中にある関数を呼ぶ
RをwindowsにインストールするとbinフォルダにR.dll等のDLLが一緒にインストールされる。
この中にはRで使われている関数が入っているようで、これをMicrosoft Visual Studio C++ 2010から呼んでみた。
呼び出し方法は通常DLLを動的にロードするのとまったく同じやり方でOK。
以下コード(空のプロジェクトにメインファイル1枚だけで作成)
ここで計算しているのは参考リンクの方と同じくガンマ関数の値。
#include <windows.h> #include <iostream> //doubleの引数一個取ってdoubleの値返す関数ポインタをRFuncと定義 typedef double(*RFunc)(double x); int main(void) { //R.dllを召喚。exeのファイルと同じ箇所に入れているとしてる HINSTANCE handle_Dll = LoadLibrary(TEXT("R.dll")); if( ! handle_Dll ){ std::cout << "DLL load error"; return 1; } std::cout << "DLL loaded \n"; //ガンマ関数の関数ポインタをdllから召喚 RFunc gamma = (RFunc)GetProcAddress(handle_Dll, "Rf_gammafn"); //Γ(0.5)の値を表示(もちろんRで出す値と一致!) std::cout << "Γ(0.5):" << gamma(0.5); //DLLを解放 FreeLibrary(handle_Dll); return 0; }
ここで出てくる値がRの吐く値とおおよそ一致しているのは確認済。
コンパイルしたら出来上がるexeと同じフォルダにRのbinフォルダからDLLを全部コピって持ってくれば動いた。
コピーするの嫌な方はちゃんとパスを通しておきましょう。私はパスとか考えるのめんどくさかったので全部コピー。
R.dllの中にはほかにもいろいろ関数が存在しているので、Dependency Walkerを使ってDLLを直接見て推測するか、参考リンクの方が書いてくれているようにRのincludeフォルダにあるヘッダーファイルを見て関数名から動作を推測しましょう。
【参考リンク】
R の関数を C# から使う