// 詠み人知らず 2006/02/04 COLOR(red){SIZE(30){Rから他言語利用(インチキ版)}} よいこは[[Rから他言語利用]](ご本家)を使うこと。 インチキなやり方で,ほかの言語によるプログラムと連絡を取る *1. 例 2 個一組の一様乱数をたくさん与えて,シミュレーションにより pi を計算する *2. 処理の流れ **2.1. R の関数 + 下請けプログラム(get.pi)が使用するデータファイル(urand.dat)を用意する~ urand 関数で 1 行あたり 2 個の一様乱数を urand.dat というファイルに出力する urand 関数で 1 行あたり 2 個の一様乱数を urand.dat というファイルに出力する~ 注:単純な情報(数個の数値など)の場合には,ファイルを介さずに受け渡せる。 + system 関数により,下請けプログラム(get.pi)を起動する~ 下請けプログラムの引数は,データ入力ファイル名(urand.dat)と,結果出力ファイル名(result.dat) + 結果出力ファイル(result.dat)ができるまで待つ + 結果を読んで出力する simulation <- function(n) { sink("urand.dat") # 乱数をファイルに書き出す for (i in 1:n) cat(runif(2), "\n") sink() unlink("result.dat") # 結果ファイルを消去しておく system("./get.pi urand.dat result.dat") # 下請けプログラム起動 while (!file.exists("result.dat")) Sys.sleep(1) # 計算終了を待つ scan("result.dat") # 結果を読みとる } **2.2. 下請けプログラム + 実行可能であればどのようなものでも良い(C でも,AWK でも,perl や,その他の言語でも。。。)~ + データ入力ファイル名からデータを読んで(引数から情報を受け取って),計算して,結果出力ファイル名に結果を書く。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define MXLN 1024 int main(int argc, char *argv[]) { double x, y, pi = 0, n = 0; char *p; char param[MXLN]; FILE *in, *out; if (argc != 3) return(EXIT_FAILURE); if ((in = fopen(argv[1], "r")) == NULL) return(EXIT_FAILURE); if ((out = fopen(argv[2], "w")) == NULL) return(EXIT_FAILURE); for (;;) { fgets(param, MXLN, in); if (feof(in)) break; p = strtok(param, " ,\t"); x = atof(p); p = strtok(NULL, " ,\t"); y = atof(p); n++; if (x*x+y*y < 1) pi++; } fprintf(out, "%g\n", pi/n*4); return(EXIT_SUCCESS); } *3. 実行結果 > simulation(20000) Read 1 item [1] 3.1384