2013-12-20 1 views
1

Я хотел бы прочитать CSV-файл в R. Я смог отправить абсолютный путь файла к R, и он вернет его через переменную $test в приведенном ниже PHP-коде. $r->evalString("data<-read.csv(filetim,header=TRUE)"); возвращает ошибку, указанную ниже. Любые идеи относительно того, что вызывает ошибку?Как я могу прочитать CSV-файл в R, используя Rserve для связи с PHP в системе LAMP?

<?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(), вы можете поймать сообщения об ошибках внутри 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 ищет ваш файл. Обратите внимание, что вам может понадобиться обернуть весь вызов tryCatch в as.character(). Я не уверен, что Rserve в сочетании с php может обрабатывать объекты simpleWarning.