Cで作成したコードをRから実行

Scilabと同様に,RでもCで作成したコードを呼び出して実行出来ます。Scilabより方法は簡単で,RjpWikiですぐに見つかりました。ほとんどリンク先の内容をトレースしただけですが,あくまで個人的な備忘録という目的なので,そのままやってみます。

(動作環境) R 2.12.1 (64-bit)
(OS) MacOS X 10.6.8

手順
1. 以下の簡単なサンプルプログラムを作成(ファイル名: mysum.c

void mysum(double *a, double *b, double *c) {
  double sum;
  sum = *a + *b;
  *c = sum;
}

※必ずvoid型の関数にして,計算結果は引数に返すようです。
※引数はすべてポインタ変数にするようです。

2. ターミナルから以下のコマンドでコンパイル

$ R CMD SHLIB mysum.c

そうすると以下が表示されて,mysum.soが作成される。

gcc -arch x86_64 -std=gnu99 -I/Library/Frameworks/R.framework/Resources/include -I/Library/Frameworks/R.framework/Resources/include/x86_64  -I/usr/local/include    -fPIC  -g -O2 -c mysum.c -o mysum.o
gcc -arch x86_64 -std=gnu99 -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/usr/local/lib -o mysum.so mysum.o -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation

3. Rのコンソールからmysum.soをロードすれば実行可能です。

> dyn.load(“mysum.so”)

※32bitのRではdyn.loadを実行するとエラーになることがあります(参考サイト,こちらはFORTRANのようですが)

4. Rの関数を定義

> mysum <- function(a,b) { .C(“mysum”, arg1=as.double(a), arg2=as.double(b), arg3=double(1))}

5. 実行すると,結果が計算されます

> mysum(2,4.3)
$arg1
[1] 2
$arg2
[1] 4.3
$arg3
[1] 6.3

ちょっとだけ改良

でもなんかこのままだとarg1, arg2とかが表示されて煩わしい感じがします。それで,一度mysum1.Rを以下の内容で作成し,

mysum1 <- function(a,b) {
 .C("mysum", arg1=as.double(a), arg2=as.double(b), arg3=double(1))
}

別途,mysum.Rを以下の内容で作成します。

source("mysum1.R")
 mysum <- function(a,b) {
 return(mysum1(a,b)$arg3);
}

これでどうでしょうか。Rからは以下のコマンドで実行出来ます。

> source(“mysum.R”)
> mysum(2,4.3)
[1] 6.3

もっと良い方法があるのかもしれませんが,.Cによる関数の読み込みだけを行う関数を間にワンクッション入れると,自由度の高い書き方が出来るように思えます。

↓↓簡単な説明しかしてませんが網羅性は高いです。ある程度の知識があればかなり使える本です