2017-06-28 13 views
0

いくつかのパラメータを最適化するためにRを使いたいと思います。したがって、私は、Javaのメソッドを持っている:私は何JavaのRからメソッドを呼び出すとメソッドのエラーが見つかりません

Error in .jcall(obj, returnSig = "D", "run", params[1], : method run with signature (DDD)D not found 

:私は、次のエラーメッセージが表示されます。このことから

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") 

を:

run(double hw, doubl sw, double no){...; return someDouble) 

は、今私が使用してRからこれを呼び出すと思いました間違っている?

EDIT:

私はアプリケーションを実行して、単純なSystemcommandを開始することができたrJava中1(1.7.0_79のx64)と同じパッチおよびビットバージョンを持っているIDEのJava私のJDKを変更Rの中でも私はまだ.jpackageや.jinitを使ってjarファイル全体をJVMにロードすることができません。

EDIT2: JARファイルをJVMに読み込むことができました。 これは私の現在のコードです:事前に任意の助け

Error in .jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl, : java.lang.NoSuchMethodException: No suitable method for the given parameters Called from: .jcheck(silent = FALSE)

ありがとう:私は次のエラーを与える

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; 
     } 
    } 

+0

いいえ.jmethodsは私がプロジェクトを再構築しても、戻り値なしでrun()が期待されるという結果を私に出しました。クラスの名前を変更してクラスを再構築した後も、呼び出す唯一のメソッドとしてrun()が表示されます。注:オブジェクトから派生したものではありません! –

+0

これは単なる狂気です。今、私は何か残ったものを取り除くためにRStudioを閉じます。そして今、それはクラスを見つけることができませんでした。私は何も変更しませんでした。 –

答えて

0

それが正常に動作したらその後、あなたは次のよう

> javac -d target sample/*.java 
> java -cp target sample.DoubleCall 

それをコンパイルしてテストできるのは、あなたがこの構造

. 
├── 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)); 
    } 
} 

次のコンパイルとしましょう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 

それが動作するはずで遊ぶことができます。

関連する問題