Выполнение Rscript из Java

Я пытаюсь выполнить сценарий R из файла Java.

Java-код

public static void main(String a[]) {
    RConnection connection = null;

    try {
        /* Create a connection to Rserve instance running on default port
         * 6311
         */
        connection = new RConnection();

        /* Note four slashes (\\\\) in the path */
        connection.eval("source(\'D:/r script/arima with upper limit final.R\')");
        //connection.eval("Rserve()");
        int lim1=2500;
        int lim2=2700;
        REXP sum=connection.eval("testfunction()");
       //System.out.println("The sum is=" +);
    } catch (RserveException e) {
        e.printStackTrace();
    } //catch (REXPMismatchException e) {
        //e.printStackTrace();
    //}
}

R-скрипт

testfunction = function(){
   lim1 = 2500
   lim2 = lim1+400
   start =lim2
   modeldata = as.vector(x$Mean.F3Amp)
   alarm = as.vector(x$Mean.F3HW)
   alarmpart = as.ts(alarm[lim1:lim2])
   predictalarm = alarmpart
   datapart = as.ts(modeldata[lim1:lim2])
   fit = Arima(datapart,order = c(3,1,1))
   modelforecast = forecast(fit,30)

   uppervaluemean = mean(modelforecast$upper[,2])

   prevMean = mean(tail(datapart,30))
   newMean =mean(modelforecast$mean)
   alarmMean = mean(tail(alarmpart,30))
   if(abs(alarmMean-uppervaluemean)>=0.01)
   {
   uppervaluemean =uppervaluemean+0.005
   predictalarm = c(predictalarm,rep.int(uppervaluemean,30))
   } else
   {
   predictalarm = c(predictalarm,rep.int(alarmMean,30))
   print("Else")
   }

   plot(modelforecast,xlim=c(0,lim2-lim1+30),ylim=c(0,0.6))
   lines(alarmpart,col=3)

   lines(predictalarm,col=5)

  filename = paste("D:/Plots123/plot",toString(iteration),".jpg",sep="")
  dev.copy(jpeg,filename=filename)
  dev.off()
  TRUE
}

Я новичок в RServe. Ниже приведена ошибка, которую я получаю.

org.rosuda.REngine.Rserve.RserveException: ошибка eval, статус запроса: код ошибки: 127 в org.rosuda.REngine.Rserve.RConnection.eval(RConnection.java:234) в pkg.Temp.main(Temp.java: 23)

Строка 23: REXP sum=connection.eval("testfunction()");


person Vini    schedule 16.08.2016    source источник


Ответы (1)


Проблема в том, что не рекомендуется вызывать пользовательские функции просто так, поскольку их сложно отлаживать. Сейчас трудно сказать, где оценка R-сценария терпит неудачу.

Но сразу видно, что сценарий может быть оценен неправильно, поскольку существуют внешние переменные, такие как x, которые могут отсутствовать в рабочей среде Rserve. Также библиотеки, такие как forecast, fpp, возможно, не были импортированы, но используются внутри функции. Вероятно, вам нужно внести некоторые изменения в код скрипта, которые могут включать такие строки, как:

library(forecast)
library(fpp)
x<-5 #or whatever x is

а затем определите свою функцию ниже всего вышеперечисленного.

Попробуйте использовать это, что может помочь указать на ошибку:

REXP sum = connection.parseAndEval("try("+testfunction()+",silent=TRUE)");
if (sum.inherits("try-error")) System.err.println("Error: "+sum.asString());
person brijs    schedule 17.08.2016
comment
Arima не является определяемой пользователем функцией. Я попытаюсь добавить библиотеку, которой мне не хватает в коде. - person Vini; 26.08.2016