来自R in Java的调用方法给出了丢失的方法错误

时间:2017-06-28 13:03:23

标签: 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("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)

提前感谢您的帮助!

1 个答案:

答案 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

它应该有用。