Rから他言語利用
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
//佐藤(2003-7-26)
COLOR(red){SIZE(30){Rから他言語利用}}
(単なる雛型の提供です。誤りも含まれてると思います。修正お...
-CRAN にあるパッケージ RcppTemplate は R と Cpp 間のイン...
-mno-cygwin-howto.txtの和訳へのリンクを追加したのと、マン...
-FORTRAN を利用する場合を付け加えました(C とほとんど,同...
- 私の環境(WinXP)でR2.5.0&2.5.1のwin32でうまく行かずR2.3...
- はやとちりだったようです。他の方はうまくいっていますの...
- [[こんな:http://www.okada.jp.org/RWiki/?R%A4%AB%A4%E9%C...
#comment
ここでは、RからC, Fortranなど他言語で記述されたルーチン(...
詳細は,R付属のドキュメント「Writing R Extensions」の「Sy...
// "*", "**", "***" による段落に応じて、ハイパーリンク付...
// 行頭が "//" で始まる行はコメントで表示されません。
#contents
// SIZE(num){テキスト} はテキスト文字の大きさを指定します
// COLOR{color}{テキスト} はテキスト文字の色を指定します
// 行頭が "**" で始まると、直前の "*" で始まる段落の副段...
// 二重括弧 "((...))" で囲ったテキストは注釈になります。...
// 行頭に半角空白を置くとこの通り枠で囲って見易く整形され...
// 行頭に半角空白がある引き続く行は一まとめに整形されます
// コードを書くのに便利です
// 行頭が "***" で始まると、直前の "**" で始まる副段落の...
----
// 行頭に "*" を置くと、段落見出しとして整形されます
*作業手順 [#wcb88f43]
+ C 言語でコード(ルーチン)を記述
+ C のコードから共用ライブラリをビルド
+ R 内にて共用ライブラリをロード
+ R 内で関数定義
+ 利用
*例題(C言語篇 その1) [#d5f86691]
例題として,単純なスカラーどうしの足し算をおこなう関数をC...
れをRで利用することを試みる。
** C 言語でコードを記述 [#g9f53826]
C 言語でルーチン(関数)を記述して,''mysum.c'' というファ...
内容は以下のとおり。
void mysum(double *a, double *b, double *c)
{
double sum;
sum = *a + *b;
*c = sum;
}
ここで注意すべきは,
+ ルーチン ''mysum'' は ''void型'' であること
+ 引数は,たとえスカラーであってもポインタとしておくこと ...
+ ほしい返り値(計算結果)も引数に含めておくこと (''doubl...
** コードから共用ライブラリをビルド [#x715e8ca]
共用ライブラリをビルドするためにターミナルにて,以下のコ...
る。
$ R CMD SHLIB mysum.c
そうすると,オブジェクトファイル ''mysum.o'' 、共用ライブ...
成される。
** R内で共用ライブラリをロード [#r5168c3c]
R 内で共用ライブラリをロードするために以下のコマンドを実...
> dyn.load("./mysum.so")
**Windows の場合 [#e81931ba]
[[ここ:http://gsbwww.uchicago.edu/fac/peter.rossi/teachin...
必要なものは以下の三つで、ダウンロード後、展開してパスを...
+ A set of compatible tools which are various UNIX utilit...
http://www.murdoch-sutherland.com/Rtools/
+ A version of PERL for Windows~
http://www.activestate.com/Products/ActivePerl/Download.h...
+ The “minimal” version of GNU for windows (MinGW)~
http://prdownloads.sourceforge.net/mingw/~
(例えば,C:\MinGW\bin;C:\Perl\bin;C:\R\rw2001\binを環境変...
C/Fortran のプログラム作成後(ここでは"mysum.c")、コマン...
Rcmd SHLIB mysum.c
を実行、すると dll ファイルができるので、 R のコンソール...
> dyn.load("mysum.dll")
として読み込みます。あとの手順は、以下と同様です。
Q&Aからなかまさんのありがたいお言葉を転載します。
-目的がRと他言語(C,Fortran)ならMingwを使いましょう.目的が...
上記mno-cygwin-howto.txtはリンク切れで見つからなくなって...
** R 内で関数定義 [#o03829b7]
R 内にて,関数 ''.C()'' を用いて関数 ''mysum()'' を定義...
mysum <- function(a,b){
.C("mysum", #Cルーチン名
arg1=as.double(a), #Cルーチン第1引数の型指定
arg2=as.double(b), #Cルーチン第2引数
arg3=double(1) #Cルーチン第3引数
)
}
ここで注意すべきは,
(1).Cの第1引数には,C言語で記述したルーチン名(mysum)を文...
(2).Cの残りの引数は,ルーチンの引数と「順番」「型」「数...
(3)ここで定義した関数は,ルーチンの全引数を要素とするリ...
特定の引数のみ(例えば足し算の答)を返すようにしたけ...
")$arg3"などとする。
**利用 [#hcc1e8bc]
上記の関数定義を行なったあとで,
> z <- mysum(1.234,2.345)
> z
などとしてみると以下のようにな結果になる。
$arg1
[1] 1.234
$arg2
[1] 2.345
$arg3
[1] 3.579
*例題(C言語篇 その 2) もう少し大規模な例 [#y28f32ad]
パラメータベクトルを C サブルーティンに渡して、Mersenne-T...
一回のシミュレーションを実行する R 関数
onesimulation <- function () {
cat("simulation start \n")
N <- GMRF(c(2.632, -0.9675, -0.2236, -0.3041, 5000))
dim(N) <- c(100,200) # ベクトル返り値を行列に変換
write(t(N), ncolumns=200, file="simulation.result")
}
与えられたパラメータベクトル param を用い、C サブルーティ...
GMRF <- function (param)
.Call( "gmrf", as.numeric(as.vector(param)) )
C サブルーティン gmrf.c は Mersenne-Twister 乱数発生 C ...
$ R CMD SHLIB gmrf.c mt19937-2.c
オブジェクトファイル gmrf.o 共用ライブラリgmrf.so が作成...
R内で共用ライブラリをロードするために以下のコマンドを実行...
> dyn.load("./gmrf.so")
////////////////////////////////////////////////////////...
// シミュレーションプログラム gmrf.c
////////////////////////////////////////////////////////...
#include <R.h>
#include <Rinternals.h>
// use mt19937-2.c (mersenne-twister algorithm) Mersenne...
extern void sgenrand(unsigned long seed);
extern double genrand(void);
////////////////////////////////////////////////////////...
// 与えられたパラメータベクトル param でシミュレーション
////////////////////////////////////////////////////////...
SEXP gmrf(SEXP param)
{
long int niter; // 繰り返し回数
double p[5]; // パラメータ用ベクトル
int N[100][200]; // 計算結果用整数行列
--- (その他省略) -----
SEXP ans; // 返り値用 R データの宣言
for(i = 0; i <= 3; i++) p[i] = REAL(param)[i]; // パラ...
niter = REAL(param)[4]; // シミュレ...
PROTECT(ans = allocVector(INTSXP, 100*200)); // 返り...
sgenrand(time(NULL)); // Mers...
--- (途中省略) -----
for(i = 0; i < 10; i++) {
(genrand() < 0.6) ? (Pat[i]=1):(Pat[i]=0); // Mersen...
}
--- (途中省略) -----
for (i = 0; i < 100; i++)
for (j = 0; j < 200; j++)
INTEGER(ans)[200*i+j] = N[i][j]; // 結果をベクト...
UNPROTECT(1); // 変数 ans の PROTECT を解除
return(ans); // ベクトル返り値
}
* Mandelbrot フラクタル図形を書くRプログラム例 (高速化の...
[[ソースと実行例はここ:http://www.geocities.com/mariodosr...
Linux の場合、 zip ファイルを解凍し(unzip mandelbrot.zip)...
$ R CMD SHLIB mandelbrot.c
とすると共有ライブラリ mandelbrot.so が出来る。R を起動し
> dyn.load("mandelbrot.so") # 共有ライブラリをロード
> source("mandelc.R") # R コードを読み込み
> image(mandelbrot()) # 実行と image 関数によ...
> mandelbrot <- # オプション引数で...
function(x = c(-3, 1), # x limits
y = c(-1.8, 1.8), # y limits
nx = 600, # x resolutio
ny = 600, # y resolution
iter = 20) # maximun number...
{関数本体省略}
Windowsの場合も、MinGWだと
$ Rcmd.exe SHLIB mandelbrot.c
で良いが、これを無理矢理Cygwinでコンパイルしたい場合は以...
1. cc1.exe と libgcc.a の在り処を探す.私の環境では /usr/...
2. 上記ディレクトリにパスを通す
export PATH=$PATH:/usr/lib/gcc/i686-pc-cygwin/3.4.4
3. その上でソースをコンパイルする.-mno-cygwin オプション...
gcc -shared -o mandelbrot.dll mandelbrot.c -mno-cygwin -...
4. mandelbrot.dll が出来るので、dyn.loadすればO.K.
実際にはCygwinのバージョンにも依存しますし、なかまさんご...
*FORTRAN の場合(Mac OS X) Jun 07, 2006 [#eb80082a]
直角三角形の,直角を挟む二辺の長さを与え,斜辺の長さを返...
** Fortran プログラムを書く [#t8e11e66]
function ではなく,subroutine にする。hyp.f という名前に...
戻り値は変数にセットする(例では変数 c)
subroutine hyp(a, b, c)
real*8 a, b, c
c = sqrt(a**2+b**2)
end
** 共用ライブラリを作る [#d50bf7ca]
hyp.so という名前のファイルができる
$ R CMD SHLIB hyp.f
gfortran-4.0 -arch ppc -fPIC -fno-common -g -O2 -c hy...
gcc-4.0 -arch ppc -flat_namespace -bundle -undefined sup...
-L/usr/local/lib -o hyp.so hyp.o -lgfortran -lgcc_s -...
-lmx -lSystem -L/Library/Frameworks/R.framework/Resour...
** R プログラムを書く [#x5a447bd]
hyp <- function(a,b){
.Fortran("hyp",
arg1=as.double(a),
arg2=as.double(b),
arg3=double(1)
)
}
** R コンソールで利用する [#m92fa346]
> dyn.load("hyp.so")
> hyp <- function(a,b){
+ .Fortran("hyp",
+ arg1=as.double(a),
+ arg2=as.double(b),
+ arg3=double(1)
+ )
+ }
> hyp(3,4)
$arg1
[1] 3
$arg2
[1] 4
$arg3
[1] 5
> hyp(1.2345, 3.1415)
$arg1
[1] 1.2345
$arg2
[1] 3.1415
$arg3
[1] 3.375354
*参考文献 [#y8641476]
+R Development Core Team,"Writing R Extensions",chapter 4...
注意点:実際の作業手順と記述順序が逆転しているので見通しが...
+R.A.ベッカー+J.M.チェンバース+A.R.ウィルクス 著(渋谷政昭...
注意点:この書は,S(engine)用の記述なので,手順自体は同じ...
+W.N.Venables and B.D.Ripley(2000),"S Programming",Spring...
関連リンク(R,Cのコード) http://www.stats.ox.ac.uk/pub/MAS...
+J.M. Chambers 著(垂水ら訳)「データによるプログラミング」...
+[[Rのお部屋(あーるのおへや)>http://phoenixx.sakura.ne....
--[[RからCを呼ぶ(Linux編)>http://phoenixx.sakura.ne.jp/...
--[[RからCを呼ぶ(Linux編) - ちょっとしたコツ>http://pho...
--[[RからCを呼ぶ(Linux編) - blas・lapack>http://phoenix...
終了行:
//佐藤(2003-7-26)
COLOR(red){SIZE(30){Rから他言語利用}}
(単なる雛型の提供です。誤りも含まれてると思います。修正お...
-CRAN にあるパッケージ RcppTemplate は R と Cpp 間のイン...
-mno-cygwin-howto.txtの和訳へのリンクを追加したのと、マン...
-FORTRAN を利用する場合を付け加えました(C とほとんど,同...
- 私の環境(WinXP)でR2.5.0&2.5.1のwin32でうまく行かずR2.3...
- はやとちりだったようです。他の方はうまくいっていますの...
- [[こんな:http://www.okada.jp.org/RWiki/?R%A4%AB%A4%E9%C...
#comment
ここでは、RからC, Fortranなど他言語で記述されたルーチン(...
詳細は,R付属のドキュメント「Writing R Extensions」の「Sy...
// "*", "**", "***" による段落に応じて、ハイパーリンク付...
// 行頭が "//" で始まる行はコメントで表示されません。
#contents
// SIZE(num){テキスト} はテキスト文字の大きさを指定します
// COLOR{color}{テキスト} はテキスト文字の色を指定します
// 行頭が "**" で始まると、直前の "*" で始まる段落の副段...
// 二重括弧 "((...))" で囲ったテキストは注釈になります。...
// 行頭に半角空白を置くとこの通り枠で囲って見易く整形され...
// 行頭に半角空白がある引き続く行は一まとめに整形されます
// コードを書くのに便利です
// 行頭が "***" で始まると、直前の "**" で始まる副段落の...
----
// 行頭に "*" を置くと、段落見出しとして整形されます
*作業手順 [#wcb88f43]
+ C 言語でコード(ルーチン)を記述
+ C のコードから共用ライブラリをビルド
+ R 内にて共用ライブラリをロード
+ R 内で関数定義
+ 利用
*例題(C言語篇 その1) [#d5f86691]
例題として,単純なスカラーどうしの足し算をおこなう関数をC...
れをRで利用することを試みる。
** C 言語でコードを記述 [#g9f53826]
C 言語でルーチン(関数)を記述して,''mysum.c'' というファ...
内容は以下のとおり。
void mysum(double *a, double *b, double *c)
{
double sum;
sum = *a + *b;
*c = sum;
}
ここで注意すべきは,
+ ルーチン ''mysum'' は ''void型'' であること
+ 引数は,たとえスカラーであってもポインタとしておくこと ...
+ ほしい返り値(計算結果)も引数に含めておくこと (''doubl...
** コードから共用ライブラリをビルド [#x715e8ca]
共用ライブラリをビルドするためにターミナルにて,以下のコ...
る。
$ R CMD SHLIB mysum.c
そうすると,オブジェクトファイル ''mysum.o'' 、共用ライブ...
成される。
** R内で共用ライブラリをロード [#r5168c3c]
R 内で共用ライブラリをロードするために以下のコマンドを実...
> dyn.load("./mysum.so")
**Windows の場合 [#e81931ba]
[[ここ:http://gsbwww.uchicago.edu/fac/peter.rossi/teachin...
必要なものは以下の三つで、ダウンロード後、展開してパスを...
+ A set of compatible tools which are various UNIX utilit...
http://www.murdoch-sutherland.com/Rtools/
+ A version of PERL for Windows~
http://www.activestate.com/Products/ActivePerl/Download.h...
+ The “minimal” version of GNU for windows (MinGW)~
http://prdownloads.sourceforge.net/mingw/~
(例えば,C:\MinGW\bin;C:\Perl\bin;C:\R\rw2001\binを環境変...
C/Fortran のプログラム作成後(ここでは"mysum.c")、コマン...
Rcmd SHLIB mysum.c
を実行、すると dll ファイルができるので、 R のコンソール...
> dyn.load("mysum.dll")
として読み込みます。あとの手順は、以下と同様です。
Q&Aからなかまさんのありがたいお言葉を転載します。
-目的がRと他言語(C,Fortran)ならMingwを使いましょう.目的が...
上記mno-cygwin-howto.txtはリンク切れで見つからなくなって...
** R 内で関数定義 [#o03829b7]
R 内にて,関数 ''.C()'' を用いて関数 ''mysum()'' を定義...
mysum <- function(a,b){
.C("mysum", #Cルーチン名
arg1=as.double(a), #Cルーチン第1引数の型指定
arg2=as.double(b), #Cルーチン第2引数
arg3=double(1) #Cルーチン第3引数
)
}
ここで注意すべきは,
(1).Cの第1引数には,C言語で記述したルーチン名(mysum)を文...
(2).Cの残りの引数は,ルーチンの引数と「順番」「型」「数...
(3)ここで定義した関数は,ルーチンの全引数を要素とするリ...
特定の引数のみ(例えば足し算の答)を返すようにしたけ...
")$arg3"などとする。
**利用 [#hcc1e8bc]
上記の関数定義を行なったあとで,
> z <- mysum(1.234,2.345)
> z
などとしてみると以下のようにな結果になる。
$arg1
[1] 1.234
$arg2
[1] 2.345
$arg3
[1] 3.579
*例題(C言語篇 その 2) もう少し大規模な例 [#y28f32ad]
パラメータベクトルを C サブルーティンに渡して、Mersenne-T...
一回のシミュレーションを実行する R 関数
onesimulation <- function () {
cat("simulation start \n")
N <- GMRF(c(2.632, -0.9675, -0.2236, -0.3041, 5000))
dim(N) <- c(100,200) # ベクトル返り値を行列に変換
write(t(N), ncolumns=200, file="simulation.result")
}
与えられたパラメータベクトル param を用い、C サブルーティ...
GMRF <- function (param)
.Call( "gmrf", as.numeric(as.vector(param)) )
C サブルーティン gmrf.c は Mersenne-Twister 乱数発生 C ...
$ R CMD SHLIB gmrf.c mt19937-2.c
オブジェクトファイル gmrf.o 共用ライブラリgmrf.so が作成...
R内で共用ライブラリをロードするために以下のコマンドを実行...
> dyn.load("./gmrf.so")
////////////////////////////////////////////////////////...
// シミュレーションプログラム gmrf.c
////////////////////////////////////////////////////////...
#include <R.h>
#include <Rinternals.h>
// use mt19937-2.c (mersenne-twister algorithm) Mersenne...
extern void sgenrand(unsigned long seed);
extern double genrand(void);
////////////////////////////////////////////////////////...
// 与えられたパラメータベクトル param でシミュレーション
////////////////////////////////////////////////////////...
SEXP gmrf(SEXP param)
{
long int niter; // 繰り返し回数
double p[5]; // パラメータ用ベクトル
int N[100][200]; // 計算結果用整数行列
--- (その他省略) -----
SEXP ans; // 返り値用 R データの宣言
for(i = 0; i <= 3; i++) p[i] = REAL(param)[i]; // パラ...
niter = REAL(param)[4]; // シミュレ...
PROTECT(ans = allocVector(INTSXP, 100*200)); // 返り...
sgenrand(time(NULL)); // Mers...
--- (途中省略) -----
for(i = 0; i < 10; i++) {
(genrand() < 0.6) ? (Pat[i]=1):(Pat[i]=0); // Mersen...
}
--- (途中省略) -----
for (i = 0; i < 100; i++)
for (j = 0; j < 200; j++)
INTEGER(ans)[200*i+j] = N[i][j]; // 結果をベクト...
UNPROTECT(1); // 変数 ans の PROTECT を解除
return(ans); // ベクトル返り値
}
* Mandelbrot フラクタル図形を書くRプログラム例 (高速化の...
[[ソースと実行例はここ:http://www.geocities.com/mariodosr...
Linux の場合、 zip ファイルを解凍し(unzip mandelbrot.zip)...
$ R CMD SHLIB mandelbrot.c
とすると共有ライブラリ mandelbrot.so が出来る。R を起動し
> dyn.load("mandelbrot.so") # 共有ライブラリをロード
> source("mandelc.R") # R コードを読み込み
> image(mandelbrot()) # 実行と image 関数によ...
> mandelbrot <- # オプション引数で...
function(x = c(-3, 1), # x limits
y = c(-1.8, 1.8), # y limits
nx = 600, # x resolutio
ny = 600, # y resolution
iter = 20) # maximun number...
{関数本体省略}
Windowsの場合も、MinGWだと
$ Rcmd.exe SHLIB mandelbrot.c
で良いが、これを無理矢理Cygwinでコンパイルしたい場合は以...
1. cc1.exe と libgcc.a の在り処を探す.私の環境では /usr/...
2. 上記ディレクトリにパスを通す
export PATH=$PATH:/usr/lib/gcc/i686-pc-cygwin/3.4.4
3. その上でソースをコンパイルする.-mno-cygwin オプション...
gcc -shared -o mandelbrot.dll mandelbrot.c -mno-cygwin -...
4. mandelbrot.dll が出来るので、dyn.loadすればO.K.
実際にはCygwinのバージョンにも依存しますし、なかまさんご...
*FORTRAN の場合(Mac OS X) Jun 07, 2006 [#eb80082a]
直角三角形の,直角を挟む二辺の長さを与え,斜辺の長さを返...
** Fortran プログラムを書く [#t8e11e66]
function ではなく,subroutine にする。hyp.f という名前に...
戻り値は変数にセットする(例では変数 c)
subroutine hyp(a, b, c)
real*8 a, b, c
c = sqrt(a**2+b**2)
end
** 共用ライブラリを作る [#d50bf7ca]
hyp.so という名前のファイルができる
$ R CMD SHLIB hyp.f
gfortran-4.0 -arch ppc -fPIC -fno-common -g -O2 -c hy...
gcc-4.0 -arch ppc -flat_namespace -bundle -undefined sup...
-L/usr/local/lib -o hyp.so hyp.o -lgfortran -lgcc_s -...
-lmx -lSystem -L/Library/Frameworks/R.framework/Resour...
** R プログラムを書く [#x5a447bd]
hyp <- function(a,b){
.Fortran("hyp",
arg1=as.double(a),
arg2=as.double(b),
arg3=double(1)
)
}
** R コンソールで利用する [#m92fa346]
> dyn.load("hyp.so")
> hyp <- function(a,b){
+ .Fortran("hyp",
+ arg1=as.double(a),
+ arg2=as.double(b),
+ arg3=double(1)
+ )
+ }
> hyp(3,4)
$arg1
[1] 3
$arg2
[1] 4
$arg3
[1] 5
> hyp(1.2345, 3.1415)
$arg1
[1] 1.2345
$arg2
[1] 3.1415
$arg3
[1] 3.375354
*参考文献 [#y8641476]
+R Development Core Team,"Writing R Extensions",chapter 4...
注意点:実際の作業手順と記述順序が逆転しているので見通しが...
+R.A.ベッカー+J.M.チェンバース+A.R.ウィルクス 著(渋谷政昭...
注意点:この書は,S(engine)用の記述なので,手順自体は同じ...
+W.N.Venables and B.D.Ripley(2000),"S Programming",Spring...
関連リンク(R,Cのコード) http://www.stats.ox.ac.uk/pub/MAS...
+J.M. Chambers 著(垂水ら訳)「データによるプログラミング」...
+[[Rのお部屋(あーるのおへや)>http://phoenixx.sakura.ne....
--[[RからCを呼ぶ(Linux編)>http://phoenixx.sakura.ne.jp/...
--[[RからCを呼ぶ(Linux編) - ちょっとしたコツ>http://pho...
--[[RからCを呼ぶ(Linux編) - blas・lapack>http://phoenix...
ページ名: