将数据从Perl传递给R.

时间:2014-08-18 19:43:23

标签: r perl

我想将以下数据从perl传递给R,并通过rescaler函数将它们重新缩放(在R中缩放为[0,1]),然后将它们发送回Perl。

$m1 = 4;
$m2 = 5.3;
$m3 = 2; 
$m4 = 1; 
$m5 = 1.3; 
$m6 = 2;

我做了:

my $R = Statistics::R->new() ;
$R->startR ;

$R->set('data', $m1 . ',' . $m2 . ',' . $m3 . ',' . $m4 . ',' . $m5 . ',' . $m6);
$R -> run(q`
library(reshape);
scaled_data <- rescaler(data, type="range");
`);
my $scaled_data = $R -> get('scaled_data');
print $scaled_data,"\n",$data,"\n";
$R->stopR();

但是我收到以下错误。

Problem while running this R command:

library(reshape);
scaled_data <- rescaler(data);



Error:
x - mean(x, na.rm = TRUE) :
  non-numeric argument to binary operator
Calls: rescaler -> rescaler.default
In addition: Warning message:
In mean.default(x, na.rm = TRUE) :
  argument is not numeric or logical: returning NA
Execution halted

1)如何正确传递数据? 2)我认为通过这种方法,代码将运行缓慢,我是否需要将数据发送到R进行重新缩放?

@Len Jaffe和@MrFlick

我试过了:

my $R = Statistics::R->new() ;
$R->startR;

$R->set('data', [ $m1 , $m2 , $m3 , $m4 , $m5 , $m6 ] );
$R -> run(q`library(reshape);scaled_data <- rescaler(data)`);
my $scaled_data = $R -> get('scaled_data');
print $scaled_data,"\n";
$R->stopR();

我得到了:

ARRAY(0xdde3d0)

2 个答案:

答案 0 :(得分:3)

你确定你不想要:

  $R->set('data', [ $m1 , $m2 , $m3 , $m4 , $m5 , $m6 ] );

如何在Statistics::R

的Perldoc中记录set命令的方式

答案 1 :(得分:1)

Perl中的这样的东西应该可以工作

use List::Util qw( min max );

my @m = (4,5.3,2,1,1.3,2);
my $min = min @m;
my $max = max @m;
my @scaled = map {($_-$min)/($max-$min)} @m;

print join(" - ", @m), "\n";
print join(" - ", @scaled), "\n";

和那个输出

4 - 5.3 - 2 - 1 - 1.3 - 2
0.69767441860 - 1 - 0.23255813953 - 0 - 0.069767441860 - 0.23255813953

我相信你使用Statistics :: R包的主要问题是set命令。 R需要一个向量,所以该集可能应该看起来像

$R->set('data', @m);
# or maybe $R->set('data', [$m1,$m2,$m3,$m4,$m5,$m6]);

但我没有安装该软件包,所以我没有测试它。