PerlスクリプトからRを起動する
の編集
http://www.okadajp.org/RWiki/?Perl%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%8B%E3%82%89R%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
(no template pages)
COLOR(red){SIZE(30){PerlスクリプトからRを起動}} #contents ~ *Perl 内部から R をバッチモードで実行 [#aea0de90] 以下の Perl スクリプトを数値引数 num で実行すると、log(num) を R で計算する。R のプログラムファイルを Perl 中で作成し、それを COLOR(magenta){<} でバッチモードの R に引き渡すのがミソ。(ソース:r-help の記事) ########## Perl スクリプト ########################## #!/usr/bin/perl (($arg1) = @ARGV) || die "Must pass a numerical argument.?n"; $script = "/tmp/rwrap$$.R"; open(SCRIPT, ">$script"); print SCRIPT <<EOF; arg1 <- $arg1 options(error=expression(q(status=arg1))) if (arg1 > 0) log(arg1) q() EOF close(SCRIPT); system("R --vanilla --slave < $script"); ($Rstat = $?/256) && die "Aborted in R with status $Rstat.?n"; unlink $script; ##################################################### $ ./test.perl 2.0 # Unix のコンマンドラインから実行 [1] 0.6931472 # log(2.0) 実行結果を Perl の内部で受け取る方法は、以下の通り。 @array = `R --vanilla --slave < $script`; ## 行ごとの文字列を分けて格納 $scalar = `R --vanilla --slave < $script`; ## 各行を結合して変数に格納 *RSPerl の利用 [#n91292ff] (そういうものがあるらしい。使ったことのある人の解説を期待) インストールしてみましたが、下記のようなエラーが出ます。 環境:VineSeed+perl5.8.1+R1.7.0+RSPerl_0.5-7 $ PERLLIB=/usr/lib/R/library/RSPerl/share/lib/perl5/site_perl/5.8.1/i386-linux-? thread-multi:/usr/lib/R/library/RSPerl/share/blib/lib perl test.pl 1..1 Can't load '/usr/lib/R/library/RSPerl/share/lib/perl5/site_perl/5.8.1/i386- linux-thread-multi/auto/R/R.so' for module R: /usr/lib/R/library/RSPerl/libs/ libPerlConverter.so: undefined symbol: R_GlobalEnv at /usr/lib/perl5/5.8.1/i386-linux-thread-multi/DynaLoader.pm line 229. at test.pl line 11 Compilation failed in require at test.pl line 11. BEGIN failed--compilation aborted at test.pl line 11. not ok 1 以下のようにインストールすれば、いちおうテストプログラム(RSPerl/inst/tests/の下のファイル)は動作します。(R-2.5.0, Perl 5.8.8) R CMD INSTALL --configure-args='--with-in-perl' RSPerl_0.92-1.tar.gz export PERL5LIB=/usr/local/lib/R/library/RSPerl/perl:$PERL5LIB source /usr/local/lib/R/library/RSPerl/scripts/RSPerl.bsh でもやっぱりいくつかのプログラムが動きません。 RSPerl/inst/examples$ perl test4.pl Can't locate object method "TIESCALAR" via package "RHashAccessor" at /usr/local/lib/R/library/RSPerl/perl/i486-linux-gnu-thread-multi/RReferences.pm line 58. *PDL::R::math [#g8b98ed4] Perl内からR関数を利用するモジュール http://search.cpan.org/~cavanaugh/PDL-R-math-0.12/rmath.pd -実行結果を Perl の内部で受け取る方法ですが, system() の代わりにバッククォート・コマンド `` を使えばよいのでは? たとえば, $output = `R --vanilla --slave < $script`; if ($output =~ /^?[?d+?]?s+(?S+)/) { $result = $1; print "log($arg1) = $result?n"; } (すみません, 「コメントの挿入」で複数行に分けて入力する方法が分かりません. というか, できるのでしょうか?) -- &new{2004-01-23 (金) 10:39:35}; #comment * Perl から R を操作するモヂュール Statistics::R (2004.2.23) [#pa58aff2] r-help 記事を引用 -I have released the new module Statistics::R and need some feedback of it's status. This will permit the control of the the R (R-project) interpreter through Perl in different architectures and OS. You can for example, start only one instance of the R interpreter and have different Perl process accessing it. What will save the initiation time of R and memory. So, I will appreciate if some one can test it in different OS. Tested with Win32 and Linux. Thanks in advance. Regards, Graciliano M. P. ~ [[URLはここ:http://search.cpan.org/~gmpassos/Statistics-R-0.01/]] * IPC::Open2 [#td5e43aa] #!/usr/local/bin/perl -s use strict; use FileHandle; use IPC::Open2; use IPC::Open3; if (1) { my($fhr) = new FileHandle(); my($fhw) = new FileHandle(); my($fhe) = new FileHandle(); my($fhOld) = select($fhw); $| = 1; select($fhOld); open2($fhr, $fhw, '/usr/bin/R', '--no-save'); # open3($fhw, $fhr, $fhe, '/usr/bin/R', '--no-save'); my($i); for($i = 0; $i <= 10; $i++) { # ↓もし ?n となっていたら ¥n です(Wiki が原因?) $fhw->print("1:($i*10)\n"); # ↓ここも同様 $fhw->print("print('EndOfCommands')\n"); # あとでコマンドの終了を検知するため while($_ = $fhr->getline()) { if (/"EndOfCommands"/) { last; # R の処理が終了した } print; } } exit(0); }
タイムスタンプを変更しない
COLOR(red){SIZE(30){PerlスクリプトからRを起動}} #contents ~ *Perl 内部から R をバッチモードで実行 [#aea0de90] 以下の Perl スクリプトを数値引数 num で実行すると、log(num) を R で計算する。R のプログラムファイルを Perl 中で作成し、それを COLOR(magenta){<} でバッチモードの R に引き渡すのがミソ。(ソース:r-help の記事) ########## Perl スクリプト ########################## #!/usr/bin/perl (($arg1) = @ARGV) || die "Must pass a numerical argument.?n"; $script = "/tmp/rwrap$$.R"; open(SCRIPT, ">$script"); print SCRIPT <<EOF; arg1 <- $arg1 options(error=expression(q(status=arg1))) if (arg1 > 0) log(arg1) q() EOF close(SCRIPT); system("R --vanilla --slave < $script"); ($Rstat = $?/256) && die "Aborted in R with status $Rstat.?n"; unlink $script; ##################################################### $ ./test.perl 2.0 # Unix のコンマンドラインから実行 [1] 0.6931472 # log(2.0) 実行結果を Perl の内部で受け取る方法は、以下の通り。 @array = `R --vanilla --slave < $script`; ## 行ごとの文字列を分けて格納 $scalar = `R --vanilla --slave < $script`; ## 各行を結合して変数に格納 *RSPerl の利用 [#n91292ff] (そういうものがあるらしい。使ったことのある人の解説を期待) インストールしてみましたが、下記のようなエラーが出ます。 環境:VineSeed+perl5.8.1+R1.7.0+RSPerl_0.5-7 $ PERLLIB=/usr/lib/R/library/RSPerl/share/lib/perl5/site_perl/5.8.1/i386-linux-? thread-multi:/usr/lib/R/library/RSPerl/share/blib/lib perl test.pl 1..1 Can't load '/usr/lib/R/library/RSPerl/share/lib/perl5/site_perl/5.8.1/i386- linux-thread-multi/auto/R/R.so' for module R: /usr/lib/R/library/RSPerl/libs/ libPerlConverter.so: undefined symbol: R_GlobalEnv at /usr/lib/perl5/5.8.1/i386-linux-thread-multi/DynaLoader.pm line 229. at test.pl line 11 Compilation failed in require at test.pl line 11. BEGIN failed--compilation aborted at test.pl line 11. not ok 1 以下のようにインストールすれば、いちおうテストプログラム(RSPerl/inst/tests/の下のファイル)は動作します。(R-2.5.0, Perl 5.8.8) R CMD INSTALL --configure-args='--with-in-perl' RSPerl_0.92-1.tar.gz export PERL5LIB=/usr/local/lib/R/library/RSPerl/perl:$PERL5LIB source /usr/local/lib/R/library/RSPerl/scripts/RSPerl.bsh でもやっぱりいくつかのプログラムが動きません。 RSPerl/inst/examples$ perl test4.pl Can't locate object method "TIESCALAR" via package "RHashAccessor" at /usr/local/lib/R/library/RSPerl/perl/i486-linux-gnu-thread-multi/RReferences.pm line 58. *PDL::R::math [#g8b98ed4] Perl内からR関数を利用するモジュール http://search.cpan.org/~cavanaugh/PDL-R-math-0.12/rmath.pd -実行結果を Perl の内部で受け取る方法ですが, system() の代わりにバッククォート・コマンド `` を使えばよいのでは? たとえば, $output = `R --vanilla --slave < $script`; if ($output =~ /^?[?d+?]?s+(?S+)/) { $result = $1; print "log($arg1) = $result?n"; } (すみません, 「コメントの挿入」で複数行に分けて入力する方法が分かりません. というか, できるのでしょうか?) -- &new{2004-01-23 (金) 10:39:35}; #comment * Perl から R を操作するモヂュール Statistics::R (2004.2.23) [#pa58aff2] r-help 記事を引用 -I have released the new module Statistics::R and need some feedback of it's status. This will permit the control of the the R (R-project) interpreter through Perl in different architectures and OS. You can for example, start only one instance of the R interpreter and have different Perl process accessing it. What will save the initiation time of R and memory. So, I will appreciate if some one can test it in different OS. Tested with Win32 and Linux. Thanks in advance. Regards, Graciliano M. P. ~ [[URLはここ:http://search.cpan.org/~gmpassos/Statistics-R-0.01/]] * IPC::Open2 [#td5e43aa] #!/usr/local/bin/perl -s use strict; use FileHandle; use IPC::Open2; use IPC::Open3; if (1) { my($fhr) = new FileHandle(); my($fhw) = new FileHandle(); my($fhe) = new FileHandle(); my($fhOld) = select($fhw); $| = 1; select($fhOld); open2($fhr, $fhw, '/usr/bin/R', '--no-save'); # open3($fhw, $fhr, $fhe, '/usr/bin/R', '--no-save'); my($i); for($i = 0; $i <= 10; $i++) { # ↓もし ?n となっていたら ¥n です(Wiki が原因?) $fhw->print("1:($i*10)\n"); # ↓ここも同様 $fhw->print("print('EndOfCommands')\n"); # あとでコマンドの終了を検知するため while($_ = $fhr->getline()) { if (/"EndOfCommands"/) { last; # R の処理が終了した } print; } } exit(0); }
テキスト整形のルールを表示する