2017-06-28 4 views
0

Je veux utiliser R pour optimiser certains paramètres. Par conséquent, j'ai une méthode java:La méthode d'appel de Java dans R donne l'erreur de méthode manquante

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

Maintenant, je voulais appeler cela de R en utilisant:

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

A partir de ce que je reçois le message d'erreur suivant:

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

Que suis-je mal faire?

EDIT:

J'ai changé mon Java JDK dans l'IDE pour avoir le même patch et la version binaire que celui Rjava (1.7.0_79 x64) Je suis en mesure de commencer simple Systemcommand exécutant l'application à l'intérieur de R mais je ne suis toujours pas capable d'obtenir .jpackage ou .jinit pour charger le fichier jar entier dans JVM.

EDIT2: J'ai pu charger le fichier JAR dans la machine virtuelle Java. Ceci est mon code actuel:

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) 

Et

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

Ce qui me donne l'erreur suivante:

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

Merci pour toute aide à l'avance!

+0

Ok .jmethods m'a donné comme résultat qu'il s'attend à ce que run() soit sans valeur de retour même si je reconstruis le projet. Après avoir renommé et reconstruit la classe, elle me montre toujours run() comme seule méthode à appeler. NOTE: Ce n'est pas dérivé de l'objet! –

+0

C'est tout simplement fou. Maintenant, je ferme RStudio pour se débarrasser des restes que ce soit et maintenant il trouve la classe, alors que je n'ai pas changé tout ce qui attend la fermeture et l'ouverture de rstudio –

Répondre

0

Disons que vous avez cette structure

. 
├── sample 
│   └── DoubleCall.java 
└── target 
    └── sample 
     └── DoubleCall.class 

et vous compilez code suivant

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

Ensuite, vous pouvez compiler et tester suivant façon

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

Une fois que cela fonctionne très bien , vous pouvez exporter CLASSPATH et démarrer R

> export CLASSPATH=`pwd`/target 
> R 

Ensuite, vous pouvez jouer avec 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 

Il devrait fonctionner.