पर्ल उप से गैर-चरित्र तर्क त्रुटि, लेकिन आर में काम करता है
मेरे पास एक तुच्छ आर स्क्रिप्ट है जो अच्छी तरह से काम करती है:
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))
और मैं एक पर्ल सबरूटीन लिखने की कोशिश कर रहा हूं जो सांख्यिकी :: आर पैकेज का उपयोग करते हुए आर में उपरोक्त कार्रवाई करेंगे:
#!/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'
});
लेकिन इस पर्ल स्क्रिप्ट को चलाने से एक त्रुटि उत्पन्न होती है:
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) में नॉन कैरेक्टर तर्क में कुछ ऐसा ही है, लेकिन मैं यह नहीं देखता कि मेरे मामले में क्या लागू किया जाए।
शायद यह सांख्यिकी में कुछ त्रुटि है :: आर? पर्ल उप इनपुट आर स्क्रिप्ट के समान होना चाहिए।
और मुझे पता नहीं है कि इसका क्या कारण है, क्योंकि मैं जो R कमांड का उपयोग कर रहा हूं वह वर्किंग R स्क्रिप्ट के समान है।
पर्ल उप क्यों विफल हो जाता है, भले ही वह आर स्क्रिप्ट के समान ही क्यों न हो?
जवाब
लापता सतर्क:
$R -> set("$key", $args->{data}{key});
होना चाहिए
$R -> set("$key", $args->{data}{$key});
# ^
अन्यथा, ए और बी आबादी वाले हैं undef
जो त्रुटि की ओर जाता है।
BTW, के "$key"
रूप में ही है $key
। चर को दोगुना करने की कोई आवश्यकता नहीं है।