- 論壇徽章:
- 0
|
以下是從網(wǎng)上收集的從perl中調(diào)用R的方法:
1 直接用system()命令
比如有個test.R程序,可以通過下面的方式調(diào)用:
system("R <test.R --vanilla")
2 安裝模塊RSperl
該模塊的具體介紹http://www.omegahat.org/RSPerl/
安裝過程如下:
tar zxf RSPerl_0.9-0.tar.gz
R CMD INSTALL --configure-args='--with-in-perl' RSPerl
cd RSPerl/src
make -f Makefile.perl install
設(shè)置環(huán)境變量:
$R_LIBS:設(shè)置需要的R的包的位置,默認(rèn)是$R_HOME/library/。
$PERL5LIB:設(shè)置需要的perl包(R.pm,RReferences.pm,R.so)的位置。
RSPerl/scripts /目錄里提供了兩個設(shè)置環(huán)境變量的shell命令文件,可以直接使用:source RSPerl/scripts/RSPerl.csh
3 使用perl中的module Statistics::R
(轉(zhuǎn)自http://cos.name/bbs/simple/index.php?t16122.html)
用Statistics::R ,既可適用于Win32平臺,也可在Linux 中使用。
不過Win32平臺安裝模塊要在cmd命令行中使用cpan進(jìn)行安裝,而ActivePerl的PPM找不到安裝模塊。
模塊有一共有四個:Statistics::R
Statistics::R::Bridge
Statistics::R::Bridge::Win32
Statistics::R::Bridge::pipe
不過好像先安裝第二個,再安裝第一個,后邊2個好像會自動安裝(我裝的時候沒注意,反正用cpan再裝多一次也無防)
以下是一個在Win32平臺的示例:輸出一個矩陣及打印輸出矩陣的行例數(shù):
--------------------------------------------------------
#!usr/bin/perl-w
use Statistics::R;
my $R = Statistics::R->new() ;
$R->startR ;
$R->send(qq`A=rbind(c(76.0, 91.5, 85.5, 82.5, 79.0, 80.5, 74.5,79.0, 85.0, 76.5, 82.0, 95.0, 92.5), \n
c(50, 20, 20, 30, 30, 50, 60, 50, 40, 55,40, 40, 20), \n
c(120, 141, 124, 126, 117, 125, 123, 125,132, 123, 132, 155, 147)) \n`) ;
$R->send(qq`ncol=ncol(A);
nrow=nrow(A) \n print(paste("矩陣A是",nrow,"行",ncol,"例矩陣",sep="")) `);
my $ret = $R->read; print $ret,"\n";
$R->send(qq`print(A)`);
my $ret = $R->read;
print $ret; $R->stopR();
#注:$R->read只能讀取到R最后一次的輸出信息,所以R每輸出一次信息就需調(diào)用一次$R->read,然后將其結(jié)果用print在perl中打印輸出
-------------------------------------------------------
輸出結(jié)果為:
[1] "矩陣A是3行13例矩陣"
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
[1,] 76 91.5 85.5 82.5 79 80.5 74.5 79 85 76.5 82 95 92.5
[2,] 50 20.0 20.0 30.0 30 50.0 60.0 50 40 55.0 40 40 20.0
[3,] 120 141.0 124.0 126.0 117 125.0 123.0 125 132 123.0 132 155 147.0
-------------------------------------------------------
一般人希望用perl調(diào)用R的目的 應(yīng)該不只是希望得到R的處理結(jié)果,而是希望perl能利用R內(nèi)部的大量科學(xué)計算函數(shù):
假如要將變量從perl傳入R中進(jìn)行計算(如將$a=1傳進(jìn)R),或要將調(diào)用R函數(shù)計算出的唯一結(jié)果值傳入perl再進(jìn)行后續(xù)處理(如
將向量c(1,2,3,4,6)的均值加上$a的結(jié)果傳入perl后利用perl再進(jìn)行加2處理),可以如下寫腳本:
#!usr/bin/perl-w
use Statistics::R;
my $a=1;
my $R = Statistics::R->new();
$R->startR; $R->send(qq`x=c(1,2,3,4,6) \n y=mean(x) \n z=$a+y \n print(z)`) ;
my $ret = $R->read;
print $ret,"\n";
#輸出R的處理結(jié)果
$R->stopR(); $ret=~s/\[\d\]\s+(\d+)/$1/g;
my $b=$ret+2;
print $b;
#輸出最終結(jié)果個人感覺還是用system()函數(shù)比較方便,其他兩種都有點麻煩。
[ 本帖最后由 hu145165 于 2009-12-21 14:59 編輯 ] |
|