2014-02-25 18 views
0

我正在用Perl編寫一個CGI腳本,其中包含一段嵌入式R腳本,它可以生成一個圖形。原始數據文件名是未知的,因爲它已由CGI腳本上傳並存儲在名爲$filename的Perl變量中。從R中動態設置文件名讀取

我的問題是,我現在想使用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中的文件之前,知道像「的data.txt」這唯一的工作 - 有沒有辦法讓我打開一個名稱爲變量的文件?

預先感謝您。

+0

您是否指的是您正在使用'$ filename'的唯一一行,它是'$ R-> set('filename',$ filename);',或者您是否犯了一個錯字並且意味着其中一個字符串在'run()'命令中,你把'filename'(沒有美元符號)放在哪裏。 – TLP

+0

基本上我想讓R讀取一個字符串變量,比如'$ filename',因爲R將處理的數據將在一個動態命名的數據框中。我知道R無法識別諸如$或@之類的標記,但有沒有解決方法? – user3350686

+0

「/ var/www/uploads」中有多少個文件?你想要讀取的文件的擴展名是什麼? – Victorp

回答

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程序。當你使用單引號操作符,使用雙引號操盤手:

所以不是:

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

用途:

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

現在,這看起來會邀請類似於SQL /代碼注入的問題,所以這就是爲什麼我把邏輯放在int中以確保文件存在並且是可讀的。您可能會考慮添加其他檢查以保護您使用用戶提供的信息。