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# から使う