登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

云之南

风声,雨声,读书声,声声入耳;家事,国事,天下事,事事关心

 
 
 

日志

 
 
关于我

专业背景:计算机科学 研究方向与兴趣: JavaEE-Web软件开发, 生物信息学, 数据挖掘与机器学习, 智能信息系统 目前工作: 基因组, 转录组, NGS高通量数据分析, 生物数据挖掘, 植物系统发育和比较进化基因组学

perl中如何调用R语言  

2011-06-13 15:45:25|  分类: R&Bioconductor |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
以下是从网上收集的从perl中调用R的方法:

1 直接用system()命令
比如有个test.R程序,可以通过下面的方式调用:
system("R <test.R --vanilla")
或者用R语言的 Rscript调用,在../bin目录下面。
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

设置环境变量:
$R_LIBS:设置需要的R的包的位置,默认是$R_HOME/library/。
$PERL5LIB:设置需要的perl包(R.pm,RReferences.pm,R.so)的位置。
RSPerl/scripts /目录里提供了两个设置环境变量的shell命令文件,可以直接使用:source RSPerl/scripts/RSPerl.csh


3 使用perl中的module Statistics::R
(转自
http://cos.name/bbs/simple/index.php?t16122.html)

用Statistics::R ,既可适用于Win32平台,也可在Linux 中使用。
不过Win32平台安装模块要在cmd命令行中使用cpan进行安装,而ActivePerl的PPM找不到安装模块。
模块有一共有四个:Statistics::R  
                                   Statistics::R::Bridge
                                   Statistics::R::Bridge::Win32
                                   Statistics::R::Bridge::pipe  
不过好像先安装第二个,再安装第一个,后边2个好像会自动安装(我装的时候没注意,反正用cpan再装多一次也无防)

以下是一个在Win32平台的示例:输出一个矩阵及打印输出矩阵的行例数:
--------------------------------------------------------
#!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每输出一次信息就需调用一次$R->read,然后将其结果用print在perl中打印输出
-------------------------------------------------------
输出结果为:
[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调用R的目的 应该不只是希望得到R的处理结果,而是希望perl能利用R内部的大量科学计算函数:
假如要将变量从perl传入R中进行计算(如将$a=1传进R),或要将调用R函数计算出的唯一结果值传入perl再进行后续处理(如
将向量c(1,2,3,4,6)的均值加上$a的结果传入perl后利用perl再进行加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的处理结果
  $R->stopR();
  $ret=~s/\[\d\]\s+(\d+)/$1/g;
  my $b=$ret+2;
  print $b;#输出最终结果

个人感觉还是用system()函数比较方便,其他两种都有点麻烦。

问题:
如果想将一个数组从Perl传递给R,应该怎样写呢?

谢谢!
博主回复:很简单啊 假设数组是@array=qw(1 2 3 4 5),可以有下面两种方式:

1 把数组print在一个文件里,然后在R中读文件

2 如果需要在perl中完成,那么需要在perl中写R脚本,实现你所需要的运算

  评论这张
 
阅读(3292)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018