我想将.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}
答案 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对象。