我想用R来优化一些参数。因此我有一个java方法:
run(double hw, doubl sw, double no){...; return someDouble)
现在我想用R来调用它:
library(rJava)
.jinit(someJar, "-jar")
.jaddClasspath("My\\Class\\Path")
mainR <- function(params, tmpfile=tmpfile()){
obj <- .jnew("Helper/ROptimzer")
c <- .jcall(obj, returnSig = "D", "run", params[1], params[2], params[3])
return(c)
}
params = c(1,2,3)
res <- optim(param, mainR, NULL, method="BFGS")
从此我收到以下错误消息:
Error in .jcall(obj, returnSig = "D", "run", params[1], : method run with signature (DDD)D not found
我做错了什么?
修改
我在IDE中将Java JDK更改为具有与rJava中相同的Patch和Bit版本(1.7.0_79 x64)我能够启动一个简单的Systemcommand在R中运行应用程序但我仍然无法获取.jpackage或.jinit将整个jar文件加载到JVM中。
EDIT2: 我能够将JAR文件加载到JVM中。 这是我目前的代码:
Sys.setenv(JAVA_HOME="C:\\Program Files\\Java\\jdk1.7.0_79\\jre")
library(rJava)
#.jaddClassPath("C:\\Users\\***\\artifacts")
.jinit("C:\\Users\\***\\xyz.jar","*")
print(.jclassPath())
obj <- .jnew("Helper/Optimizer")
.jmethods(obj)
mainR<-function(params)
{
c <- J(obj,returnSig = "D","optimR",params[1], params[2], params[3])
return(c)
}
param = c(1125,15,5)
res <- optim(param, mainR, NULL, method="BFGS")
print(res)
和
public double optimR(double hw, double sw, double no) {
try {
return someVeryLongRunningFunction((int)hw, (int)sw,(int) no);
} catch (Exception e) {
e.printStackTrace();
return 0.0;
}
}
这给了我以下错误:
.jcall中的错误(“RJavaTools”,“Ljava / lang / Object;”,“invokeMethod”,cl,:java.lang.NoSuchMethodException:没有合适的方法 给定的参数来自:.jcheck(silent = FALSE)
提前感谢您的帮助!
答案 0 :(得分:0)
假设你有这种结构
.
├── sample
│ └── DoubleCall.java
└── target
└── sample
└── DoubleCall.class
并编译以下代码
package sample;
public class DoubleCall {
public double optimR(double hw, double sw, double no) {
try {
return someVeryLongRunningFunction((int)hw, (int)sw,(int) no);
} catch (Exception e) {
e.printStackTrace();
return 0.0;
}
}
private double someVeryLongRunningFunction(int hw, int sw, int no) {
return 2.0;
}
public static void main(String [] arg) {
DoubleCall dc = new DoubleCall();
System.out.println("Result: " + dc.optimR(1.0, 1.1, 1.2));
}
}
然后,您可以按照
的方式编译和测试它> javac -d target sample/*.java
> java -cp target sample.DoubleCall
一旦工作正常,您可以导出CLASSPATH并启动R
> export CLASSPATH=`pwd`/target
> R
然后,你可以玩rJava
> library(rJava)
> .jinit()
> obj <- .jnew("sample.DoubleCall")
> s <- .jcall(obj, returnSig="D", method="optimR", 1.0, 1.1, 1.2)
> print(s)
> [1] 2
它应该有用。