「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。データ分析・語学に力点を置いています。 →現在、コンサルタントの雛になるべく、少しずつ勉強中です(※2024年1月21日改訂)。

MENU

プログラムとしてのRを学ぶ(その15/16)

 \mathrm{R}をプログラムとして見たときに注意・検討すべきところを学んでおきたい、ということで

を読んでいく。

15. 他の言語とのRインターフェイス

 ここでは\mathrm{R}から\mathrm{C}/\mathrm{C++}を呼び出すインターフェースと\mathrm{Python}から\mathrm{R}を呼び出すインターフェースを扱う。

15.1 Rから呼び出すC/C++関数の記述

 パフォーマンスを向上させるべく、\mathrm{R}から\mathrm{C}/\mathrm{C}++を呼び出すことがある。他には特殊な\mathrm{I}/\mathrm{O}を求める場合である。

15.1.1 RからC/C++への下準備

 \mathrm{R}が2次元配列を列優先順に格納する一方で、\mathrm{C}/\mathrm{C}++は行優先順に格納する。
 \mathrm{R}から\mathrm{C}に渡すすべての引数は、\mathrm{C}ではポインタとして受け取る。\mathrm{C}関数自体は\mathrm{void}を返さなければならず、通常の戻り値は、関数の引数を使ってやり取りする。

 たとえば以下のような\mathrm{C}のコードを処理する。

# 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];
}

 まずコードは\mathrm{R}を用いてコンパイルする。たとえば\mathrm{sd.so}という動的共有ライブラリファイルを生成した場合、そのライブラリを\mathrm{R}にロードして\mathrm{C}関数を呼び出す。

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の利用

 \mathrm{Python}は統計的操作やデータ操作のための組み込み機能が欠けており、\mathrm{R}の方が優っている。ここでは\mathrm{RPy}を用いて呼び出す方法を考える。

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))')
プライバシーポリシー お問い合わせ