gpt4 book ai didi

java - 从 Java 执行 Rscript

转载 作者:太空宇宙 更新时间:2023-11-04 12:19:38 25 4
gpt4 key购买 nike

我正在尝试从 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: 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()");

最佳答案

问题是不建议像这样调用用户定义的函数,因为它们很难调试。现在很难说 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());

关于java - 从 Java 执行 Rscript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38972928/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com