2013-04-11 71 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

相關問題