2013-12-20 23 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结合是否可以处理简单的警告对象。

相关问题