来自 Perl sub 的非字符参数错误,但在 R 中有效
non-character argument error from Perl sub, but works in R
我有一个运行良好的简单 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))
我正在尝试编写一个 perl 子例程,它将使用 Statistics::R 包在 R 中执行上述操作:
#!/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
Non character argument in R string split function (strsplit) 中有类似的内容,但我不知道如何将其中的内容应用到我的案例中。
也许这是 Statistics::R 中的一些错误? Perl 子程序的输入应与 R 脚本相同。
我不知道是什么原因导致的,因为我使用的 R 命令与工作 R 脚本相同。
为什么 Perl sub 会失败,即使它与 R 脚本完全一样?
缺少印记:
$R -> set("$key", $args->{data}{key});
应该是
$R -> set("$key", $args->{data}{$key});
# ^
否则,A 和 B 填充 undef
会导致错误。
顺便说一句,"$key"
与 $key
相同。无需双引号变量。
我有一个运行良好的简单 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))
我正在尝试编写一个 perl 子例程,它将使用 Statistics::R 包在 R 中执行上述操作:
#!/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
Non character argument in R string split function (strsplit) 中有类似的内容,但我不知道如何将其中的内容应用到我的案例中。
也许这是 Statistics::R 中的一些错误? Perl 子程序的输入应与 R 脚本相同。
我不知道是什么原因导致的,因为我使用的 R 命令与工作 R 脚本相同。
为什么 Perl sub 会失败,即使它与 R 脚本完全一样?
缺少印记:
$R -> set("$key", $args->{data}{key});
应该是
$R -> set("$key", $args->{data}{$key});
# ^
否则,A 和 B 填充 undef
会导致错误。
顺便说一句,"$key"
与 $key
相同。无需双引号变量。