Cygwin の Web ページの記述に従って,Cygwin のインストールが済んでいること. Cygwin のインストール時には,下記のソフトウェアを含めていること.
Windows の環境変数 PATH に「C:\Cygwin\bin;C:\Cygwin\usr\bin」が含まれていることを確認すること (含まれていなければ含める).
C:\R\R-2.8.1\share\perl\R の下にあるファイルについて
仮に次のような 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
コンパイル時のエラーの対処
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