2016-08-16 57 views
1

我想从Java文件执行R脚本。从Java执行Rscript

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 failed, request status: error code: 127 at org.rosuda.REngine.Rserve.RConnection.eval(RConnection.java:234) at pkg.Temp.main(Temp.java:23)

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

回答

0

的问题是,不建议调用用户定义函数刚刚一样,因为它们很难调试。现在很难说R-script评估失败的地方。

但是很容易发现,由于存在外部变量(如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()); 
+0

华宇不是一个用户定义的函数..我会尝试加入我的代码是缺少的libraris – Vini