R から C の関数を呼び出し(Windows の MinGW を使用)
このページでは,R システム から C の関数を呼び出す方法について説明する.
前準備
前もってインストールしておくべきソフトウェア
「MinGW のインストール」の Web ページの記述に従って,下記のソフトウェアのインストールが済んでいること.
- MinGW バージョン 5.1.4
- MSYS バージョン 1.0.11
- MSYS に付属の perl と crypt
前もって調べておく事項
- MinGW インストールディレクトリ: C:\MinGW
- MSYS インストールディレクトリ: C:\msys\1.0
環境変数の設定
環境変数 PATHが「C:\msys\1.0\bin;C:\MinGW\bin」を含むこと.
* つまり, MSYS インストールディレクトリの下の bin と, MinGW インストールディレクトリの下の bin を含むように設定.
ファイルのコピー
C:\R\R-2.8.1\share\perl\R の下にあるファイルについて
- C:\MinGW\lib\perl5\5.6 に,C:\R\R-2.8.1\share\perl の下にあるファイルをすべて(普通のファイルとディレクトリをすべて)コピーする.
テスト実行
テスト用の C プログラムの作成
仮に次のような C プログラムを作り,mysum.c のような名前で保存. ファイル名は mysum.c,ディレクトリ名は C:\tmp として,以下の説明を続ける.
#include<stdio.h>
#ifdef __cplusplus
extern "C" void mysum(double *a, double *b, double *c);
#endif
void mysum(double *a, int *size, double *c)
{
FILE *in_file;
char line[100];
int i;
double sum;
in_file = fopen("C:\\temp\\log.txt", "w+");
if( in_file == NULL ) {
return;
}
// print out a and size
for( i = 0; i < (*size); i++ ) {
sprintf( line, "a[%d] = %f\n", i, a[i] );
fputs( line, in_file );
}
sprintf( line, "size = %d\n", *size );
fputs( line, in_file );
sum = 0;
for( i = 0; i < (*size); i++ ) {
sum = sum + a[i];
}
*c = sum;
fclose(in_file);
}
コンパイル
コンパイルするために,次の操作を行う.
cd C:\tmp
C:\R\R-2.8.1\bin\Rcmd.exe SHLIB mysum.c

R 側の関数定義
setwd( "C:/tmp" )
dyn.load("mysum.dll")
mysum <- function(a,b){
.C("mysum", arg1=as.vector(a), arg2=as.integer(b), arg3=double(1) )
}

テスト実行
今定義した R の関数を介して,C の関数 mysum() を呼びだしてみる.
mysum( c(1,2,3,4), 4 )
