Tuesday, March 03, 2009

RでCを使うとき

完全に忘れていたので覚書。ヘッダは
#include<R.h>
#include<Rdefines.h>

で、あと必要なもの。Rのベクトル変数はSEXPで指定。関数宣言は、
SEXP likelihood(SEXP InitComplex,SEXP scn,SEXP ssn1,SEXP ssn2,SEXP theta);

とすれば返り値もベクトルになる。このRのベクトル変数を引数でもらったときはメモリ確保が必要。
SEXP p;

PROTECT(ssn1=AS_INTEGER(ssn1));
PROTECT(ssn2=AS_INTEGER(ssn2));
PROTECT(theta=AS_NUMERIC(theta));
PROTECT(p=allocVector(REALSXP,muallele*2));

最後のは関数中で宣言したR形式ベクトル変数の領域確保。

これはreturnする前にかならず解放する。
UNPROTECT(4);
return p;

ソース作成したらコンパイルは、
R CMD SHLIB **.c

で、.soファイルと.oファイルができる。
Rからの読み込みは、
dyn.load("**.so")

で、関数呼び出しは、
.Call("関数名",引数)

とする。この場合の引数はRらしからぬ厳密な型(モード?)宣言が必要。as.numericなどを使用する。

No comments: