2013-04-11 74 views
3

我试图使用Statistics::PCA软件包对一些基因变体进行PCA。该软件包需要读取列表中的列表(如果我正确理解它,可以是一个数组数组,对吧?)。perl(Statistics :: PCA):不能使用字符串(“0”)作为ARRAY ref,而“strict refs”

下面是我的代码的一部分,我为每个人创建数组(每个人都是一个实际的人类主体,它获得一个填充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 

不幸的是,这并不工作K和我得到的错误信息:

不能使用字符串(“0”)的数组引用,而“严格裁判”在使用中/home/abdel/myperl/share/perl/5.10。 1/Statistics/PCA.pm line 189.

任何想法可能会出现什么问题吗?

我希望问题是明确的,否则请让我知道如果你需要更多的信息!非常感谢!

回答

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,这样的错误更难找到。

+0

谢谢!使用“data => \ @LoL_SVs”做了诡计!我喜欢这个网站。 – Abdel 2013-04-11 12:22:49

+1

@Abdel是的,我也喜欢它。别客气。 – TLP 2013-04-11 12:26:22

相关问题