【问题标题】:reading from dynamically set filenames in R从 R 中动态设置的文件名中读取
【发布时间】:2014-02-25 10:34:10
【问题描述】:

我正在用 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' 时,我才能让它工作 - 有没有办法让我打开带有变量的文件要名字吗?

提前谢谢你。

【问题讨论】:

  • 您指的是您正在使用的唯一行$filename,即$R-&gt;set('filename',$filename);,还是您打错字并表示run() 命令中的一个字符串,您在其中输入filename(没有美元符号)。
  • 基本上我希望 R 读取一个字符串变量,例如 $filename,因为 R 将处理的数据将位于动态命名的数据框中。我知道 R 无法识别诸如 $ 或 @ 之类的符号,但有解决方法吗?
  • “/var/www/uploads”中有多少个文件?你想读的文件的扩展名是什么?
  • 许多人犯的一个非常常见的错误是,他们认为阅读问题的人知道他们无法知道的事情。例如,您正在使用这个模块是什么,如何使用它,应该如何使用它,您所说的“将 $filename 设置为静态”是什么意思(它不是已经设置为静态的吗?)。而且,你没有回答我的问题。
  • 不,我明白了,但很难正确表达。我正在编写的 CGI 脚本将被多次访问,并且可能同时访问。该脚本的重点是使用上传的数据文件(进入“/var/www/uploads”)绘制图形 - 因此该目录中可能有多个文件。我想使用 R 绘制图形。脚本上传的文件名存储在perl变量$filename中。R无法读取此变量,因此不知道在read.table中打开哪个文件。我正在尝试将$filename中存储的信息转换为格式.. .

标签: r perl cgi


【解决方案1】:

一种可能的方法是在 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->set。在您使用单引号运算符的地方,请改用双引号运算符:

所以代替:

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

用途:

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

现在这看起来会引发类似于 SQL/代码注入的问题,所以这就是我放入逻辑以确保文件存在且可读的原因。您可能可以考虑添加其他检查以保护您对用户提供的信息的使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 2014-06-12
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    相关资源
    最近更新 更多