1

我想将 .csv 文件读入 R。我已经能够将文件的绝对路径发送到 R,它将通过$test下面 PHP 代码中的变量返回它。$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}

4

1 回答 1

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

您还可以tryCatch()在 R 中使用 a 来获取 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 在哪里寻找您的文件。请注意,您可能必须将对 tryCatch 的整个调用包装在as.character(). 我不确定 Rserve 与 php 结合是否可以处理 simpleWarning 对象。

于 2013-12-20T16:09:07.650 回答