【问题标题】:perl (Statistics::PCA): Can't use string ("0") as an ARRAY ref while "strict refs"perl(Statistics::PCA):不能使用字符串(“0”)作为数组引用,而“严格引用”
【发布时间】:2013-04-11 11:48:06
【问题描述】:

我正在尝试使用Statistics::PCA 包对某些遗传变异进行 PCA。该包需要读取列表列表(如果我理解正确,那可以是数组数组,对吗?)。

下面是我的代码的一部分,我在其中为每个人创建数组(每个人都是一个实际的人类受试者,它得到一个充满 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

不幸的是,这不起作用,我收到错误消息:

在 /home/abdel/myperl/share/perl/5.10.1/Statistics/PCA.pm 第 189 行使用“严格引用”时,不能使用字符串 ("0") 作为 ARRAY 引用。

知道这里可能出了什么问题吗?

我希望问题得到很好的说明,否则如果您需要更多信息,请告诉我!非常感谢!

【问题讨论】:

    标签: perl ref strict


    【解决方案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,这样的bug 会更难找到。

    【讨论】:

    • 谢谢!!使用 "data => \@LoL_SVs" 成功了!我喜欢这个网站。
    猜你喜欢
    • 2019-06-11
    • 2014-07-18
    • 2020-05-22
    • 2023-03-31
    • 2020-02-21
    • 2022-01-15
    • 2016-12-11
    • 2014-10-30
    相关资源
    最近更新 更多