#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