Определение строковых значений или ошибок, отправленных из RServe в java

#java #r #rserve

#java #r #rserve

Вопрос:

Это мой образец R-файла :

 # 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-кода, не влияя на обнаружение ошибок?

Например:

Допустим, у меня ошибка в моем коде:

 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-файл и запуск функции main():

 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
  

Without try-error method дает нам возвращаемое строковое значение, которое мы хотели, но если есть ошибка, как в приведенном ниже случае, она возвращает 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 вы можете видеть, что мы достигли желаемого результата.

Ответ №2:

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

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

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

Комментарии:

1. Я не думаю, что это проблема. Когда я это делаю, я получаю эту ошибку Error: Error in file(filename, "r") : cannot open the connection