金子邦彦研究室プログラミングR のプログラム例R から C の関数を呼び出し(Windows の MinGW を使用)

R から C の関数を呼び出し(Windows の MinGW を使用)

このページでは,R システム から C の関数を呼び出す方法について説明する.

前準備

前もってインストールしておくべきソフトウェア

「MinGW のインストール」の Web ページの記述に従って,下記のソフトウェアのインストールが済んでいること.

前もって調べておく事項

環境変数の設定

環境変数 PATHが「C:\msys\1.0\bin;C:\MinGW\bin」を含むこと.

※ つまり, MSYS インストールディレクトリの下の bin と, MinGW インストールディレクトリの下の bin を含むように設定.

ファイルのコピー

C:\R\R-2.8.1\share\perl\R の下にあるファイルについて

テスト実行

テスト用の 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

[image]

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) )
}

[image]

テスト実行

今定義した R の関数を介して,C の関数 mysum() を呼びだしてみる.

mysum( c(1,2,3,4), 4 )

[image]