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

К сожалению, этого не происходит к, и я получаю сообщение об ошибке:

Не можете использовать строку («0») как ARRAY реф в то время как «строгие рефов» в использовании в /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 ], 

Вы пытаетесь загрузить массив, но модуль ожидает реф массив (возможно, массив refs). Поэтому, когда вы пытаетесь передать пустой массив в качестве скалярного аргумента, он вычисляет 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

+1

@ Abdel Да, мне тоже это нравится. Пожалуйста. – TLP