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



我想将.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}

此解决方案假设您在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对象。

最新更新