2016-10-06 7 views
0

Это мой пример R файла:Определение значений строки или ошибки, отправленные из RServe в Java

# filename: sample.R 
main <- function(){ 
    returnStringValue <- "ignore" 
    return (returnStringValue) 
} 
main() 

Сейчас я пытаюсь источник на файл на Rserve с помощью Java:

import org.rosuda.REngine.REXP; 
import org.rosuda.REngine.Rserve.RConnection; 

public class RServeTest { 

    static RConnection rcon; 

    public static void main(String[] args) { 
     try { 

      String fileName = "sample.R"; 
      String filePath = "/filepath/"; 

      try { 
       rcon = new RConnection(); 
      } 
      catch(Exception e){ 
       System.out.println("Error Connecting: "+e); 
      } 

      String rCode = "source(\""+filePath+fileName+"\")"; 
      System.out.println("Rscript call on file: "+rCode); 


      REXP r = rcon.parseAndEval("try(eval(parse(text="+rCode+")),silent=TRUE)"); 

      System.out.println("r object: "+r.asString()); 

      if (r.inherits("try-error")) 
       System.err.println("Error: "+r.asString()); 
      else 
       System.out.println("Executed R code successfully."); 


     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
} 

, который дает меня следующая ошибка:

Rscript call on file: source("/home/maverick/Documents/sem3/agent code/sample.R") 
Error: Error in eval(expr, envir, enclos) : object 'ignore' not found 

Как обрабатывать строковые значения, возвращаемые из кода R, не влияя на ошибки получения cau GHT?

Для например:

Скажем, у меня есть ошибка в моем коде:

main <- function(){ 
    returnStringValue <- "ignore" 

    # error 
    var1+1 

    return (returnStringValue) 
} 
main() 

код Java должен войти:

Rscript call on file: source("/filepath/sample.R") 
Error: Error in main() : object 'var1' not found 

, а не протоколирование:

org.rosuda.REngine.Rserve.RserveException: eval failed, request status: error code: 127 
    at org.rosuda.REngine.Rserve.RConnection.eval(RConnection.java:233) 
    at RServeTest.main(RServeTest.java:39) 

ответ

1

Ошибка может быть решена путем возврата объекта json из R вместо строкового значения. Вот как я решил эту ошибку:

Java-код к исходному R-файла и запустить основную функцию():

import org.rosuda.REngine.REXP; 
import org.rosuda.REngine.Rserve.RConnection; 

public class RServeTest { 

    static RConnection rcon; 

    public static void main(String[] args) { 
     try { 

      String fileName = "sample.R"; 
      // Note: Change filename for testing different samples 

      String filePath = "/filepath/"; 

      try { 
       rcon = new RConnection(); 
      } 
      catch(Exception e){ 
       System.out.println("Error Connecting: "+e); 
      } 

      String rCode = "source(\""+filePath+fileName+"\")"; 
      System.out.println("Rscript call on file: "+rCode); 

      // Source file 
      REXP r0 = rcon.parseAndEval("try(eval(parse(text="+rCode+")),silent=TRUE)"); 

      // Run main() function 
      REXP r = rcon.parseAndEval("try(eval(parse(text=main())),silent=TRUE)"); 


      System.out.println("\n--------- with try error ------------"); 

      if (r.inherits("try-error")) 
       System.out.println("Error: "+r.asString()); 
      else 
       System.out.println("Executed R code successfully."+"r object: "+r.asString()); 

      System.out.println("\n--------- without try error ------------"); 

      System.out.println("R output :"+rcon.eval("main()").asString()); 


     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
} 

R кода 1:

main <- function(){ 
    returnStringValue <- "ignore" 
    return (returnStringValue) 
} 

Результаты:

Rscript call on file: source("/filepath/sample1.R") 

--------- with try error ------------ 
Error: Error in eval(expr, envir, enclos) : object 'ignore' not found 


--------- without try error ------------ 
R output :ignore 

Без try-error метод дает нам требуемое значение возвращаемой строки, но если есть ошибка, как в c ase ниже, он возвращает eval failed, который может быть зарегистрирован только с использованием метода try-error (см. образец 2).


R Пример кода 2:

main <- function(){ 

    # error 
    var1+1 

    returnStringValue <- "ignore" 
    return (returnStringValue) 
} 

Результаты:

Rscript call on file: source("/filepath/sample2.R") 

--------- with try error ------------ 
Error: Error in main() : object 'var1' not found 


--------- without try error ------------ 
org.rosuda.REngine.Rserve.RserveException: eval failed, request status: error code: 127 
    at org.rosuda.REngine.Rserve.RConnection.eval(RConnection.java:233) 
    at RServeTest.main(RServeTest.java:43) 

Вышеупомянутая проблема может быть решена путем возвращения объекта JSON из R вместо строки стоимость.Здесь приведены примеры кодов и результаты:

R Пример кода 3:

require('rjson') 
main <- function(){ 

    # error 
    var1+1 

    returnStringValue <- "ignore" 
    returnJsonObject <- toJSON(returnStringValue) 
    return (returnJsonObject) 
} 

Результаты:

Rscript call on file: source("/filepath/sample3.R") 

--------- with try error ------------ 
Error: Error in main() : object 'var1' not found 


--------- without try error ------------ 
org.rosuda.REngine.Rserve.RserveException: eval failed, request status: error code: 127 
    at org.rosuda.REngine.Rserve.RConnection.eval(RConnection.java:233) 
    at RServeTest.main(RServeTest.java:43) 

R Пример кода 4:

require('rjson') 
main <- function(){ 

    returnStringValue <- "ignore" 
    returnJsonObject <- toJSON(returnStringValue) 

    return (returnJsonObject) 
} 

Результаты:

Rscript call on file: source("/filepath/sample4.R") 

--------- with try error ------------ 
Executed R code successfully.r object: ignore 

--------- without try error ------------ 
R output :"ignore" 

Следовательно, из примеров 3 и 4 видно, что мы достигли желаемого результата.

0

Я уверен, что ab из этого, хотя я не могу запустить и проверить, что точность, что написано ниже:

Проблема заключается в хранении rCode в переменной text, что делает REXP r стать уступкой, а не просто возвращает строку. Попробуйте удалить text=, и ваш код должен работать нормально.

Обновление с дальнейшими разработками, если выше работало.

+0

Я не думаю, что это проблема. Когда я делаю это, я получаю эту ошибку 'Ошибка: ошибка в файле (имя файла,« r »): не удается открыть соединение' –