をプログラムとして見たときに注意・検討すべきところを学んでおきたい、ということで
を読んでいく。
前回
15. 他の言語とのRインターフェイス
ここではから/を呼び出すインターフェースとからを呼び出すインターフェースを扱う。
15.1 Rから呼び出すC/C++関数の記述
パフォーマンスを向上させるべく、から/++を呼び出すことがある。他には特殊な/を求める場合である。
15.1.1 RからC/C++への下準備
が2次元配列を列優先順に格納する一方で、/++は行優先順に格納する。
からに渡すすべての引数は、ではポインタとして受け取る。関数自体はを返さなければならず、通常の戻り値は、関数の引数を使ってやり取りする。
たとえば以下のようなのコードを処理する。
# include <R/h> void subdiag(double *m, int *n, int *k, double * result) { int nval = *n, kval = *k; int stride = nval + 1; for (int i = 0, j = kval; i < nval - kval ; i++, j += stride) result[i] = m[j]; }
まずコードはを用いてコンパイルする。たとえばという動的共有ライブラリファイルを生成した場合、そのライブラリをにロードして関数を呼び出す。
dyn.load("sd.so") m <- rbind(1:5, 6:10,11:15, 16:20, 21:25) k <- 2 .C("subdiag", as.double(m), as.integer(dim(m)[1]), as.integer(k))
15.2 PythonからRの利用
は統計的操作やデータ操作のための組み込み機能が欠けており、の方が優っている。ここではを用いて呼び出す方法を考える。
from rpy import * # 以降、Pythonのクラスインスタンスである変数rを用いて、Rの関数を呼び出す r.hist(r.rnorm(100)) # rnorm()で正規乱数を呼び出し、histでその乱数のヒストグラムを書く # 注意すべきは、Pythonで使えない文字など a = [5, 12, 13] b = [10, 28, 30] lmout = r.lm('v2 ~ v1', data = r.data_frame(v1 = a, v2 = b)) # ~はPythonで使えない(ただし文字列内なので今回は問題無し)/ data.frameは.が不可なのでdata_frameに # r()を用いてRの名前空間の変数を扱うこともできる # ここではRコマンドを呼び出しているので、.や$を用いて良い r.library('lattice') r.assign('a', a) r.assign('b', b) r('g <- expand.grid(a,b)') r('g$Var3 <- g$Var1^2 + g$Var1 * g$Var2') r('wireframe(Var3 ~ Var1 + Var2, g)') r('plot(wireframe(Var3 ~ Var1 + Var2, g))')