首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何将数据::Dumper和Statistics::多样性::Shannon合并成一个完整的循环?

我如何将数据::Dumper和Statistics::多样性::Shannon合并成一个完整的循环?
EN

Stack Overflow用户
提问于 2019-12-16 02:01:22
回答 2查看 68关注 0票数 0

我想把这两个函数组合在一起,得到香农多样性指数。

能做什么呢?

第一个函数是使用Data::Dumper来获得唯一的数字。

代码语言:javascript
复制
#!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; 

这是输出

代码语言:javascript
复制
$VAR1 = { 4 3 1 1 };

然后我可以把它输入到第二个函数中。

第二个函数是利用Statistics::Diversity::Shannon求出香农多样性指数。

代码语言:javascript
复制
#!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多样性指数,将这两个函数组合成一个完整的循环。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-16 04:01:21

Data::Dumper是一个调试工具,而不是序列化工具。至少不是个好主意。

但您甚至没有使用数据::Dumper。你在用更糟糕的东西。

让我们首先使用一些可以接受的东西,比如JSON。

代码语言:javascript
复制
#!/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 }似乎并不是必需的。)

这是一种读回来的方法:

代码语言:javascript
复制
#!/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";
}

上面,当你说“合并成整个循环”时,我以为你是“一起工作”。

另一方面,也许你的意思是“合并成一个文件”。如果是这样的话,那么您可以使用以下方法:

代码语言:javascript
复制
#!/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";
}
票数 3
EN

Stack Overflow用户

发布于 2019-12-16 03:59:26

您的第一个代码段没有正确使用Data::DumperData::Dumper主要提供一个函数Dumper,它以可以解释为Perl代码的格式输出任何数据。

代码语言:javascript
复制
# instead of  printf "\$VAR1 = ...
print Dumper([values %counts]);

由于Data::Dumper::Dumper的输出是Perl代码,所以您可以通过将其计算为Perl代码(使用eval)来读取它。

因此,如果第一个脚本将输出写入名为some.data的文件,则第二个脚本可以调用

代码语言:javascript
复制
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 );
...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59349733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档