我想将以下数据从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)
答案 0 :(得分:3)
你确定你不想要:
$R->set('data', [ $m1 , $m2 , $m3 , $m4 , $m5 , $m6 ] );
的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]);
但我没有安装该软件包,所以我没有测试它。