2016-08-16 110 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