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

我想用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")
我做错了什么

编辑:

我在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