Perl 하위에서 문자가 아닌 인수 오류이지만 R에서 작동합니다.

Jan 06 2021

잘 작동하는 사소한 R 스크립트가 있습니다.

library(gplots)
A <- c("dog", "cat", "monkey", "fish", "cow", "frog")
B <- c("cat", "frog", "aardvark", "monkey", "cow", "lizard", "bison", "goat")

png('tmp.png')
venn(list(A=A,B=B))

Statistics :: R 패키지를 사용하여 R에서 위의 작업을 수행 할 perl 서브 루틴을 작성하려고합니다.

#!/usr/bin/env perl

use strict;
use warnings FATAL => 'all';
use feature 'say';
use autodie ':all';
use Carp 'confess';
use Statistics::R;

my @t1 = ("dog", "cat", "monkey", "fish", "cow", "frog");
my @t2 = ("cat", "frog", "aardvark", "monkey", "cow", "lizard", "bison", "goat");
my %data = (
    A => [@t1],
    B => [@t2]
);
sub venn {
    my ($args) = @_; unless (defined $args->{output_filestem}) {
        confess "venn diagram needs an output filename" 
    }
    if (scalar keys %{ $args->{data} } < 2) { printf("There are %u keys in data.\n", scalar keys %{ $args->{data} });
        confess 'There must be >= 2 keys in data.';
    }
    my $R = Statistics::R->new(); foreach my $key (keys %{ $args->{data} }) { $R -> set("$key", $args->{data}{key});
    }
    say __LINE__;
    if (defined $args->{output_type}) { $R -> run(`$args->{output_type}('$args->{output_stem}.$args->{output_type}')`); } else { # output EPS file is default $args->{output_type} = 'eps';
        $R -> run( q`setEPS()`, qq`postscript('$args->{output_filestem}.eps')`,
        );
    }
    my @venn;
    foreach my $key (sort keys %{ $args->{data} }) {
        push @venn, "$key=$key"
    }
    my $venn_cmd = 'venn(list(' . join (', ', @venn) . '))'; say $venn_cmd;
    $R -> run(q`library(gplots)`); $R -> run(qq`$venn_cmd`); say "wrote $args->{output_filename}";
    return $args->{output_filename}
}

venn({
    data => \%data,
    output_filestem => 'venn'
});

그러나이 Perl 스크립트를 실행하면 오류가 발생합니다.

venn(list(A=A, B=B))

Error:
strsplit(names(map), character(0), fixed = TRUE) : 
  non-character argument
Calls: venn -> vennMembers -> do.call -> strsplit
Execution halted
Command exited with non-zero status 29

비슷한 것이 R 문자열 분할 함수 (strsplit)의 비 문자 인수에 있지만 내 경우에 적용하는 방법을 알 수 없습니다.

아마도 이것은 Statistics :: R의 오류일까요? Perl 하위 입력은 R 스크립트와 동일해야합니다.

내가 사용하는 R 명령이 작동하는 R 스크립트와 동일하기 때문에 원인을 알 수 없습니다.

Perl 하위가 R 스크립트와 똑같은 경우에도 실패하는 이유는 무엇입니까?

답변

4 choroba Jan 06 2021 at 03:49

인장 누락 :

$R -> set("$key", $args->{data}{key});

해야한다

$R -> set("$key", $args->{data}{$key});
#                               ^

그렇지 않으면 A와 B가 채워져 undef오류가 발생합니다.

BTW "$key"$key. 변수를 큰 따옴표로 묶을 필요가 없습니다.