R から C の関数を呼び出し(Windows 上の Cygwin を使用)
このページでは,R から C の関数を呼び出す方法について説明する.
- Windows を使う.
- R から C の関数を呼び出せるようにするために,perl と C コンパイラが必要. そこで,perl と C コンパイラを含むソフトウェアである Cygwin を使う.
前準備
前もってインストールしておくべきソフトウェア
Cygwin の Web ページの記述に従って,Cygwin のインストールが済んでいること. Cygwin のインストール時には,下記のソフトウェアを含めていること.
- Devel/gcc
- Devel/make
- Perl
前もって調べておく事項
- Cygwin インストールディレクトリ: C:\Cygwin
環境変数の設定の確認
Windows の環境変数 PATH に「C:\Cygwin\bin;C:\Cygwin\usr\bin」が含まれていることを確認すること (含まれていなければ含める).
ファイルのコピー
C:\R\R-2.8.1\share\perl\R の下にあるファイルについて
- C:\R\R-2.8.1\share\perl の下にあるファイルをすべて(普通のファイルとディレクトリをすべて), C:\cygwin\lib\perl5\site_perl\5.10 に,コピーする.

テスト実行
テスト用の C プログラムの作成
仮に次のような C プログラムを作り,mysum.c のような名前で保存. ファイル名は mysum.c,ディレクトリ名は C:\Cygwin\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;
// Window の C:\temp の下に log.txt というファイルを作る
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:\cygwin\tmp
C:\R\R-2.8.1\bin\Rcmd.exe SHLIB mysum.c

コンパイル時のエラーの対処
R 側の関数定義
setwd( "C:/cygwin/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 )
x <-mysum( c(1,2,3,4), 4 )
x$arg3
