【问题标题】:Executing Rscript from Java从 Java 执行 Rscript
【发布时间】:2016-08-16 10:49:48
【问题描述】:

我正在尝试从 Java 文件执行 R 脚本。

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:评估失败,请求状态:错误代码:127 在 org.rosuda.REngine.Rserve.RConnection.eval(RConnection.java:234) 在 pkg.Temp.main(Temp.java:23)

第 23 行:REXP sum=connection.eval("testfunction()");

【问题讨论】:

    标签: java r exception rserve


    【解决方案1】:

    问题是不建议像这样调用用户定义的函数,因为它们很难调试。现在很难说 R 脚本评估在哪里失败。

    但马上就很容易看出脚本可能无法正确评估,因为 Rserve 工作环境中可能不存在诸如 x 之类的外部变量。此外,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());
    

    【讨论】:

    • Arima 不是用户定义的函数。我会尝试添加我在代码中缺少的库
    猜你喜欢
    • 2020-09-11
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 2019-02-25
    • 2012-01-18
    • 1970-01-01
    • 2015-10-25
    • 2014-06-28
    相关资源
    最近更新 更多