R中Java的调用方法给出缺少的方法错误
我想用R来优化一些参数。因此,我有一个java方法:R中Java的调用方法给出缺少的方法错误,r,methods,double,signature,rjava,R,Methods,Double,Signature,Rjava,我想用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("Help
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")
我做错了什么
编辑:
我在IDE中更改了Java my JDK,使其具有与rJava(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)
这给了我以下错误:
.jcall(“RJavaTools”、“Ljava/lang/Object;”、“invokeMethod”、cl、:java.lang.NoSuchMethodException:没有适用于
从以下位置调用的给定参数:.jcheck(silent=FALSE)
提前感谢您的帮助!假设您拥有此结构
.
├── 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
>库(rJava)
>.jinit()
>obj s打印件(s)
> [1] 2
它应该可以工作。Okay.jmethods给我的结果是,即使我重建了项目,它仍然希望run()没有返回值。重命名和重建类后,它仍然显示run()作为唯一调用的方法。注意:它不是从object派生的!这简直是疯了。现在我关闭RStudio以清除任何剩余内容,现在它找不到类,而除了关闭和打开RStudio之外,我没有做任何更改
> export CLASSPATH=`pwd`/target
> R
> library(rJava)
> .jinit()
> obj <- .jnew("sample.DoubleCall")
> s <- .jcall(obj, returnSig="D", method="optimR", 1.0, 1.1, 1.2)
> print(s)
> [1] 2