从R中动态设置的文件名中读取

时间:2014-02-25 10:34:10

标签: r perl cgi

我正在Perl中编写一个CGI脚本,其中包含一段嵌入式R脚本,用于生成图形。原始数据文件名未知,因为它已由CGI脚本上载并存储在名为$filename的Perl变量中。

我的问题是我现在想使用read.table()在R中打开该文件。我正在使用Statistics::R,所以我尝试过:

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

$R->set('filename',$filename);

my $out1 = $R->run(

    q`rm(list=ls())`,

    #   Fetch data
    q`setwd("/var/www/uploads")`,

    q`peakdata<-read.table(filename, sep="",col.names=c("mz","intensity","ionsscore","matched","query","index","hit"))`,
    q`attach(peakdata)` ...etc

如果我在尝试打开read.table中的文件之前将$ filename更改为静态且知道为'data.txt'之类的东西,我可以让它工作 - 有没有办法让我打开一个带变量的文件一个名字?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

一种可行的方法是在Perl中做更多的工作。

这是未经测试的代码,为您提供一些想法:

  my $filename = 'fileNameIGotFromSomewhere.txt'

  my $source_dir = '/var/www/uploads';

  my $file = "$source_dir/$fielname";

  # make sure we can read it
  unless ( -r $file ) {
     die 'can read that data file: $!";
  }

然后,您可以将文件名插入R程序,而不是$ R-&gt;设置。如果您使用单引号运算符,请改用双引号运算符:

所以而不是:

    q`peakdata<-read.table(filename, sep="",col.names= .... )`

使用:

    qq`peakdata<-read.table($filename, sep="",col.names= .... )`

现在看来它会引发类似于SQL / Code Injections的问题,这就是为什么我把逻辑放在逻辑中以确保文件存在且可读。您可以考虑添加其他检查以保护您对用户提供的信息的使用。