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