2013-12-20 28 views
1

我想將.csv文件讀入R.我已經能夠將文件的絕對路徑發送給R,它將通過下面的PHP代碼中的$test變量返回它。 $r->evalString("data<-read.csv(filetim,header=TRUE)");返回下面列出的錯誤。任何想法是什麼導致了錯誤?如何使用Rserve在R中讀取R中的.csv文件以在LAMP系統上與PHP進行通信?

<?php 
require_once 'rconfig.php'; 
require 'rConnection.php'; 
try { 
    # Connect to R via Rserve 
    echo '<p>Connecting to Rserve '.RSERVE_HOST; 
    $r = new Rserve_Connection(RSERVE_HOST); 
    echo ' Connection OK</p>'; 
    # Associate filename with the file's absolute path 
    $r->evalString("filetim=('folder/folder/folder/file.csv')"); 
    $r->evalString("filebob=('folder/folder/folder/file2.csv')"); 
    # Check if the filename is being stored 
    $test = $r->evalString("filebob"); 
    echo $test; 
    # Read the .csv file into variable "data" 
    $r->evalString("data<-read.csv(filetim,header=TRUE)"); 
    $r->close(); 
} catch(Exception $e) { 
    echo $e; 
} 
?> 

錯誤:

'Rserve_Exception' with message 'unable to evaluate' in /folder/folder/folder/folder/folder/rConnection.php:239 Stack trace: #0 /folder/folder/folder/folder/folder/rcodetest.php(17): Rserve_Connection->evalString('data<-read.csv(f...') #1 {main}

回答

0

此解決方案假定你是一個Linux系統上。對於Windows(如果你讓Rserve工作......)故事是一樣的。

您給read.csv的路徑不是絕對的,而是相對路徑。 [R從工作目錄開始(默認情況下在Linux系統中經常用戶的主目錄,通過~中的R表示)

在你的情況下,絕對路徑將是

$r->evalString("filetim=('/folder/folder/folder/file.csv')"); 

要找出考慮R工作目錄,你可以使用getwd()。使用try(),你可以趕上內半徑誤差消息得到什麼地方出了錯一個更好的主意,因爲Rserve的頁面在這裏解釋說:http://rforge.net/Rserve/faq.html#errors

您也可以使用R A tryCatch()得到半徑誤差消息或警告信息。在read.csv()特定情況下的警告信息可能比錯誤更有效(這只是說「無法打開連接」)

如:

$err = $r->evalString("tryCatch(read.csv(filetim,header=TRUE), error = function(e) e)"); 
echo $err; 

捕獲錯誤,或

$err = $r->evalString("tryCatch(read.csv(filetim,header=TRUE), warning = function(w) w)"); 
echo $err; 

趕上警告。這應該讓你知道R在哪裏查找你的文件。請注意,您可能必須將整個呼叫包裝到as.character()的TryCatch中。我不確定Rserve與php結合是否可以處理簡單的警告對象。

相關問題