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

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

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

前準備

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

Cygwin の Web ページの記述に従って,Cygwin のインストールが済んでいること. Cygwin のインストール時には,下記のソフトウェアを含めていること.

前もって調べておく事項

環境変数の設定の確認

Windows環境変数 PATH に「C:\Cygwin\bin;C:\Cygwin\usr\bin」が含まれていることを確認すること (含まれていなければ含める).

ファイルのコピー

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

[image]

テスト実行

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

[image]

コンパイル時のエラーの対処

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

[image]

テスト実行

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

mysum( c(1,2,3,4), 4 )
x <-mysum( c(1,2,3,4), 4 )
x$arg3

[image]