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 の quote operatorq()を使用しました。これは、単一引用符で囲まれた文字列と同じセマンティクスを持ちます。つまり、変数補間はありません。二重引用符で囲まれた文字列 (または同等の演算子) を使用したくない場合は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です。
  • 置換の区切り文字が改善され、ファイル名からパスを削除するという、それが何をするかが明確に示されるようになりました。実際には、これを行うクロスプラットフォーム モジュールの 1 つを使用する必要があります。
  • コピーイディオムで代用を使いました(my $copy = $orig) =~ s///。perl5 v16 では、/r代わりにフラグを使用できます: my $copy = $orig =~ s///r.
  • 正規表現の/gフラグは役に立ちません。
  • 文字列の最初と最後に一致を固定しました。
  • 文字列のq``区切り文字がより見やすくなりました
于 2013-03-27T20:36:08.193 に答える
0

R は、「$」演算子を使用して文字列を連結しません。その「$query」は R 関数の引数内にあるため、Perl オペレーターに頼ることはできません。(注意: 私は Perl ユーザーではないので、あなたのコードは「query」という名前のループ内で R オブジェクトを作成していると仮定しています) もし私が正しければ、paste0() を使用する必要があるかもしれません:

ファイル引数は次のようになります。

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

わかりませんr. しかし、文字列を連結する必要があるようです。

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

于 2013-03-27T20:22:21.643 に答える