我想把这两个函数组合在一起,得到香农多样性指数。
能做什么呢?
第一个函数是使用Data::Dumper来获得唯一的数字。
#!perl
use warnings;
use strict;
use Data::Dumper;
$Data::Dumper::Sortkeys=1;
my @names = qw(A A A A B B B C D);
my %counts;
$counts{$_}++ for @names;
printf "\$VAR1 = { %s};\n",
join ' ',
map "$_ ",
sort { $b <=> $a }
values(%counts);
exit; 这是输出
$VAR1 = { 4 3 1 1 };然后我可以把它输入到第二个函数中。
第二个函数是利用Statistics::Diversity::Shannon求出香农多样性指数。
#!perl
use warnings;
use strict;
use Statistics::Diversity::Shannon;
my @data = qw( 4 3 1 1 );
my $d = Statistics::Diversity::Shannon->new( data => \@data );
my $H = $d->index();
my $E = $d->evenness();
print "$d/$H/$E";
exit;如何利用原始数据集(A、B、C、D)求出Shannon多样性指数,将这两个函数组合成一个完整的循环。
发布于 2019-12-16 04:01:21
Data::Dumper是一个调试工具,而不是序列化工具。至少不是个好主意。
但您甚至没有使用数据::Dumper。你在用更糟糕的东西。
让我们首先使用一些可以接受的东西,比如JSON。
#!/usr/bin/perl
use strict;
use warnings;
use Cpanel::JSON::XS qw( encode_json );
{
my @names = qw( A A A A B B B C D );
my %counts; ++$counts{$_} for @names;
my @data = sort { $b <=> $a } values(%counts);
print encode_json(\@data);
}(注意,sort { $b <=> $a }似乎并不是必需的。)
这是一种读回来的方法:
#!/usr/bin/perl
use strict;
use warnings;
use Cpanel::JSON::XS qw( decode_json );
use Statistics::Diversity::Shannon qw( );
{
my $json = do { local $/; <> };
my $data = decode_json($json);
my $d = Statistics::Diversity::Shannon->new( data => $data );
my $H = $d->index();
my $E = $d->evenness();
print "$H/$E\n";
}上面,当你说“合并成整个循环”时,我以为你是“一起工作”。
另一方面,也许你的意思是“合并成一个文件”。如果是这样的话,那么您可以使用以下方法:
#!/usr/bin/perl
use strict;
use warnings;
use Statistics::Diversity::Shannon qw( );
{
my @names = qw( A A A A B B B C D );
my %counts; ++$counts{$_} for @names;
my @data = values(%counts);
my $d = Statistics::Diversity::Shannon->new( data => \@data );
my $H = $d->index();
my $E = $d->evenness();
print "$H/$E\n";
}发布于 2019-12-16 03:59:26
您的第一个代码段没有正确使用Data::Dumper。Data::Dumper主要提供一个函数Dumper,它以可以解释为Perl代码的格式输出任何数据。
# instead of printf "\$VAR1 = ...
print Dumper([values %counts]);由于Data::Dumper::Dumper的输出是Perl代码,所以您可以通过将其计算为Perl代码(使用eval)来读取它。
因此,如果第一个脚本将输出写入名为some.data的文件,则第二个脚本可以调用
my $VAR1;
open my $fh, "<", "some.data";
eval do { local $/; <$fh> }; # read data from $fh and call eval on it
# now the data from the first script is in $VAR1
my $d = Statistics::Diversity::Shannon->new( data => $VAR1 );
...https://stackoverflow.com/questions/59349733
复制相似问题