免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 12172 | 回复: 19
打印 上一主题 下一主题

perl调用R函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-14 11:16 |只看该作者 |倒序浏览
论坛中的各位大侠,最近在调试代码遇到一个棘手的问题。
perl调用R函数时,会进入R的环境,此时不会生成默认的*.Rout。
R的很多日志信息会在屏幕中输出,请问我怎样才能控制这种输出呢?

sub Subtest{
        my ($aa,$bb)=@_;
        open(RF, "|$rpath --vanilla --slave ") || failmessage($!);       
        select RF;
        print <<"CODE";
        source("$Bin/test.r")
        SAMR("$aa","$bb")
        warnings()
        q()

CODE
close RF;
        }

这里的print <<"CODE";也让我一直很困惑,不知道是做什么用的?如果没有它,程序就会报错。

论坛徽章:
0
2 [报告]
发表于 2011-03-14 17:32 |只看该作者
曾有类似问题,一直没有答案!!

论坛徽章:
0
3 [报告]
发表于 2011-03-15 08:04 |只看该作者
试试R的sink()函数

论坛徽章:
0
4 [报告]
发表于 2011-03-15 09:13 |只看该作者
回复 1# biomashujie


    "CODE" is the identifier in "here-document" syntax. You can get details in perlop.

    By the way, to use R in Perl, Statistics::useR may be also one good solution.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2011-03-15 09:32 |只看该作者
这里的print <<"CODE";也让我一直很困惑,不知道是做什么用的?如果没有它,程序就会报错。
biomashujie 发表于 2011-03-14 11:16


这就是问题所在,使用一种语言,而不去系统地了解它的语法,这注定是要悲剧的。

论坛徽章:
0
6 [报告]
发表于 2011-03-15 09:54 |只看该作者
试试R的sink()函数
oldbeggar 发表于 2011-03-15 08:04



首先谢谢这位大侠。   
使用了sink()函数,发现这个函数与重定向方法相似。可以保存一些R运行的结果。但是如果在调用R包的时候,如果缺少某个包或者某个包名有错误,这些屏幕上的报错是不会备sink()捕获的。
如果将将报错信息也捕获了,就完美了~~

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
7 [报告]
发表于 2011-03-15 14:04 |只看该作者
论坛中的各位大侠,最近在调试代码遇到一个棘手的问题。
perl调用R函数时,会进入R的环境,此时不会生成默认 ...
biomashujie 发表于 2011-03-14 11:16


参考...

perl中如何调用R语言
http://blog.sciencenet.cn/home.p ... =blog&id=272196

RSPerl:在Perl里面调用R
http://gossipcoder.com/?p=53

论坛徽章:
0
8 [报告]
发表于 2011-03-15 17:34 |只看该作者
回复 7# jason680


    大侠,我是在windows下运行代码的。
所以不能用Rs2perl。

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
9 [报告]
发表于 2011-03-15 17:55 |只看该作者
回复  jason680


    大侠,我是在windows下运行代码的。
所以不能用Rs2perl。
biomashujie 发表于 2011-03-15 17:34



... 用Statistics::R ,既可适用于Win32平台,也可在Linux 中使用。....

论坛徽章:
0
10 [报告]
发表于 2011-03-16 00:54 |只看该作者
本帖最后由 aef25u 于 2011-03-16 01:09 编辑
参考...

perl中如何调用R语言


RSPerl:在Perl里面调用R
jason680 发表于 2011-03-15 14:04



没想到我发在人大经济论坛使用Statistics::R的例子还被这么多人转载。好久没用R语言了。
后来发现使用Statistics::R得指定文件夹了。代码如下my $R = Statistics::R->new( log_dir => 'D:/R/tem', tmp_dir => 'D:/R/tem' );
再写一个有perl与R基础都容易看懂的例子。<<"RCODE"...RCODE间是纯R语言代码。其它部分就是perl的代码了。
  1. #!usr/bin/perl-w
  2. use strict;
  3. use Statistics::R;

  4. my $R_code=<<"RCODE";
  5. y1=c(67.63,68.20,69.23,67.90,66.90,66.10,69.21,66.20,64.90,67.20,63.30,65.00,64.10,64.60,62.20)
  6. y2=c(rep(1,7),rep(2,8))
  7. d=data.frame(income=y1,area=factor(y2))
  8. attach(d)
  9. print('Mann-Whitney检验:')
  10. print(wilcox.test(income~area,data=d))
  11. print('双样本Kolmogorov-Smirnov检验:')
  12. print(ks.test(income[area==1],income[area==2]))
  13. detach(d)
  14. RCODE

  15. my $R = Statistics::R->new( log_dir => 'D:/R/tem', tmp_dir => 'D:/R/tem' );

  16. #$R->error;
  17. $R->startR;
  18. $R->send($R_code);
  19. my $ret = $R->read;
  20. print $ret, "\n";

  21. $R->stopR();
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP