0

我试图处理不同的文件,比如 R 脚本的输入,为此我在 Perl 中使用了一个 foreach 循环,但是 R 向我发送了一个警告:

Problem while running this R command:
a <- read.table(file="~/Desktop/ncRNA/Data/Inputs/Boxplot_all/All/$newquery")

Error:
file(file, "rt") : cannot open the connection
Calls: read.table -> file
In addition: Warning message:
In file(file, "rt") :
cannot open file '/Users/cristianarleyvelandiahuerto/Desktop/ncRNA/Data/Inputs/Boxplot_all/All/$newquery': No such file or directory
Execution halted

我的代码是:

#!/usr/bin/perl

use strict;
use warnings;
use Statistics::R;
use Data::Dumper;

my $R = Statistics::R->new();

my @query = (
    '~/Desktop/ncRNA/Data/Inputs/Boxplot_all/All/dvex_all_rRNA_ce.RF00001.txt',
    '~/Desktop/ncRNA/Data/Inputs/Boxplot_all/All/dvex_all_rRNA_ce_60.RF00001.txt',
    '~/Desktop/ncRNA/Data/Inputs/Boxplot_all/All/dvex_all_rRNA_ce_70.RF00001.txt',
    '~/Desktop/ncRNA/Data/Inputs/Boxplot_all/All/dvex_all_rRNA_ce_80.RF00001.txt',
    '~/Desktop/ncRNA/Data/Inputs/Boxplot_all/All/dvex_all_rRNA_ce_90.RF00001.txt'
);

foreach my $query(@query) {
    my $newquery = $query;
    $newquery =~ s/(.*)\/(dvex_all.*)(\.txt)/$2$3/g;
    print "$newquery\n";
    $R->run(q`a <- read.table(file="~/Desktop/ncRNA/Data/Inputs/Boxplot_all/All/$newquery")`);
    $R->run(q`res <- summary(a$V2)`);
    my $output_value = $R->get('res');
    print "Statistical Summary = $output_value\n";
}

使用正则表达式,我更改了输入的名称,但 R 不将其识别为文件。我可以这样做吗?一些建议?谢谢!

4

4 回答 4

4

你有:

$R->run(q`...`);

即,您正在使用qoperator。字符串插值不是用q. 直接的解决方案是使用

 $R->run(qq`...`);
于 2013-03-27T20:29:28.970 回答
1

您使用了 Perl 的引号运算符q(),它与单引号字符串具有相同的语义——也就是说,没有变量插值。如果您不想使用双引号字符串(或等效qq()运算符),则必须将变量连接到查询中:

use feature 'say';
my $workdir = "~/Desktop/ncRNA/Data/Inputs/Boxplot_all/All/";
for my $query (@query) {  
  (my $newquery = $query) =~ s{\A.*/(?=dvex_all.*[.]txt\z)}{};
  say $newquery;
  # actually, here you should escape any <"> double quotes in $workdir and $newquery.
  $R->run(q#a <- read.table(file="# . $workdir . $newquery . q#")#);
  $R->run(q#res <- summary(a$V2)#);
  my $output_value = $R->get('res');
  say "Statistical Summary = $output_value";
}

我做的其他改进:

  • 正确的意图是纠正代码的第一步
  • 功能say比.print
  • 替换有一个更好的分隔符,现在清楚地显示了它的作用:从文件名中删除路径。实际上,我们应该使用执行此操作的跨平台模块之一。
  • 我在复制习语中使用了替代品(my $copy = $orig) =~ s///。在 perl5 v16 中,您可以改用该/r标志:my $copy = $orig =~ s///r.
  • 正则表达式的/g标志是无用的。
  • 我将匹配锚定在字符串的开头和结尾。
  • q``字符串现在有一个更明显的分隔符
于 2013-03-27T20:36:08.193 回答
0

我不知道 但看起来你应该连接你的字符串。

$R->运行(q a <- read.table(file="~/Desktop/ncRNA/Data/Inputs/Boxplot_all/All/".$newquery));

于 2013-03-27T20:22:21.643 回答
0

R 不会使用“$”运算符连接字符串。“$query”在 R 函数参数中,因此您不能依赖 Perl 运算符。(警告:我不是 Perl 用户,所以我假设您的代码正在循环中创建一个名为“查询”的 R 对象)如果我是对的,那么您可能需要使用 paste0():

文件参数可能如下所示:

 file=paste0("~/Desktop/ncRNA/Data/Inputs/Boxplot_all/All/", query)
于 2013-03-27T20:39:53.047 回答