perl (Statistics::PCA): невозможно использовать строку (0) в качестве ссылки на МАССИВ, в то время как строгие ссылки

Я пытаюсь использовать статистику:: Пакет PCA для проведения PCA на некоторых генетических вариантах. Пакет требует чтения в списке списков (если я правильно понял, это может быть массив массивов, верно?).

Ниже приведена часть моего кода, где я создаю массивы для каждого человека (каждый человек является реальным субъектом-человеком, который получает массив, заполненный нулями и единицами, которые представляют наличие или отсутствие генетического варианта, называемого «СВ»), а затем поместите их в мой массив массивов с именем @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") в качестве ссылки на МАССИВ, пока используются "строгие ссылки" в /home/abdel/myperl/share/perl/5.10.1/Statistics/PCA.pm, строка 189.

Есть идеи, что здесь может пойти не так?

Я надеюсь, что проблема хорошо определена, в противном случае, пожалуйста, дайте мне знать, если вам нужна дополнительная информация! Большое спасибо!


person Abdel    schedule 11.04.2013    source источник


Ответы (1)


Ваши варианты в вызове 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 такие ошибки было бы еще сложнее найти.

person TLP    schedule 11.04.2013
comment
Спасибо!! использование данных =› \@LoL_SVs сделало свое дело! Мне нравится этот сайт. - person Abdel; 11.04.2013