如何使用Rserve在LAMP系统上与PHP通信来读取R中的.csv文件?

时间:2013-12-20 15:28:14

标签: php r csv rserve

我想将.csv文件读入R.我已经能够将文件的绝对路径发送到R,它将通过下面的PHP代码中的$test变量返回它。 $r->evalString("data<-read.csv(filetim,header=TRUE)");返回我在下面列出的错误。关于导致错误的原因有什么想法吗?

<?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}

1 个答案:

答案 0 :(得分:0)

此解决方案假设您使用的是Linux系统。对于Windows(如果你让Rserve工作......),故事是一样的。

您给read.csv的路径不是绝对路径,而是相对路径。 R从工作目录开始(默认情况下通常是Linux系统上的用户主目录,由R ~表示)

在您的情况下,绝对路径为

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

要了解R认为工作目录的内容,您可以使用getwd()。使用try(),您可以捕获R中的错误消息,以便更好地了解出现了什么问题,如Rserve网页上所述:http://rforge.net/Rserve/faq.html#errors

您还可以使用R中的tryCatch()来获取R错误消息或警告消息。在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结合可以处理simpleWarning对象。