perl (Статистика::PCA): нельзя использовать строку ("0") в качестве ссылки на ARRAY, в то время как "строгие ссылки"

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

Ниже приведена часть моего кода, где я создаю массивы для каждого человека (каждый человек - это реальный человек, который получает массив, заполненный нулями и единицами, которые представляют наличие или отсутствие генетического варианта, называемого "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 строка 189.

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

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

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Такие ошибки было бы еще труднее найти.

Другие вопросы по тегам