我正在尝试使用Statistics::PCA包对一些遗传变异进行PCA。该软件包需要读入列表列表(如果我理解正确,可以是一个数组数组,对吧?)。
下面是我的代码的一部分,我为每个人创建数组(每个人都是一个真正的人类主体,获得一个填充0和1的数组,代表是否存在称为“SV”的遗传变体) ,然后将它们推送到名为@LoL_SVs的数组数组中:
my @LoL_SVs;
foreach (@individuals) {
my $ind = $_;
foreach (@all_SVs) {
if ($SV{$ind}{$_} != 1) {
push(@{$SVs{$ind}}, "0");
}
if ($SV{$ind}{$_} == 1) {
push(@{$SVs{$ind}}, "1");
}
}
push @LoL_SVs, [ @{$SVs{$ind}} ];
}
然后我尝试加载模块的CPAN网站上描述的数据(参见* load_data *段落):
use Statistics::PCA;
my $pca = Statistics::PCA->new;
$pca->load_data ( { format => 'table', data => @LoL_SVs, } );
# ^ this line is where it goes wrong
不幸的是,这不起作用,我收到错误消息:
在/home/abdel/myperl/share/perl/5.10.1/Statistics/PCA.pm第189行使用“strict refs”时,不能使用字符串(“0”)作为ARRAY引用。
知道这里可能出现什么问题吗?
我希望问题得到明确规定,否则如果您需要更多信息,请告诉我们!非常感谢!
答案 0 :(得分:5)
load_data
来电中的选项包括:
data => @LoL_SVs
然而在文档中它被描述为
data => [ \@Obs1, \@Obs2, \@Obs3, \@Obs4, \@Obs5 ],
您尝试加载数组,但模块需要数组引用(可能是数组引用)。因此,当您尝试将空数组作为标量参数传递时,它将计算为0
(因为它包含0个元素)。类似于:
my @bar;
my $foo = @bar; # @bar is empty, $foo is 0
print $foo->[0]; # Can't use string ("0") as ARRAY ref ...
通过将引用传递给@LoL_SVs
来解决您的问题 :
data => \@LoL_SVs
作为旁注,您使用
是件好事use strict;
我也希望你正在使用
use warnings;
如果没有strict
并且使用@LoL_SVs
之类的变量名称,则很容易发生诸如@Lol_Svs
之类的拼写错误,从而导致很难发现错误。如果不使用warnings
,就会更难找到这样的错误。