2016-03-21 12 views
3

In meiner Java-Klasse Ich schreibe 3 Test funktioniert wie folgt:rjava: pass 2-dimensionale String-Array als Funktionseingang

public void try2dStringArray(String[][] arr) { 
    System.out.println(arr.length); 

} 
public void try1dStringArray(String[] arr) { 
    System.out.println(arr.length); 

} 
public void try2dDoubleArray(double[][] arr) { 
    System.out.println(arr.length); 

} 

In R Teil I laufen die folgenden:

library(rJava) 
.jinit('/path/to/my/jar/app.jar') 
obj <- .jnew('somepackage.Someclass') 
doubleMatrix <- rbind(c(1,2), c(3,4)) 
stringMatrix <- rbind(c('a', 'b'), c('c', 'd')) 
stringArray <- c('a', 'b') 

result <- .jcall(obj,"V","try1dStringArray", 
       .jarray(stringArray, dispatch = T)) 
result <- .jcall(obj,"V","try2dDoubleArray", 
       .jarray(doubleMatrix, dispatch = T)) 
result <- .jcall(obj,"V","try2dStringArray", 
       .jarray(stringMatrix, dispatch = T)) 

nur die letzte ein Fehler heraus:

Error in .jcall(obj, "V", "try2dStringArray", .jarray(stringMatrix, dispatch = T)) : 
    method try2dStringArray with signature ([[Ljava.lang.String;)V not found 

Wie aus double[][] in diesem Fall String[][] anders ist und wie kann ich f ix es?

+0

Does '.jarray (lapply (gilt (stringMatrix, 1, Funktion (x) lapply (x, .jnew, class = "java/lang/String")), jarray)) '' Erzeuge ein 'String [] []' Java-Objekt, das für deine Methode geeignet ist? – nicola

+0

@nicola Es scheint nicht zu funktionieren: 'Fehler in .jcall (obj," V "," try2dStringArray ", .jarray (lapply (apply (stringMatrix,: Methode try2dStringArray mit Signatur ([Ljava/lang/Object;) V not found' – Bamqf

+0

Es scheint, dass Sie 'Object [] []' anstelle von 'String [] []' erhalten haben. Ich habe das Dokument von '.jarray' angeschaut und vielleicht wird das Argument' contents.class' gelöst : '.jarray (apply (stringMatrix, 1, .jarray), contents.class =" java/lang/String ")'. Ich habe auch ein wenig den Befehl vereinfacht. Hoffe, das funktioniert. – nicola

Antwort

2

Zuerst dachte ich, dass .jarray richtig ein String[][] Java-Array von einer character R matrix nicht in der Lage war, zu schaffen. Ich war falsch, und der Fehler empfangen werden, wenn der Code im OP ausgeführt wird bezeugt es:

.jcall(obj,"V","try2dStringArray",.jarray(stringMatrix, dispatch = T)) 
#Error in .jcall(obj, "V", "try2dStringArray", .jarray(stringMatrix, dispatch = T)) : 
#method try2dStringArray with signature ([[Ljava.lang.String;)V not found 

Wie zu sehen ist, die Signatur (([[Ljava.lang.String;)V) korrekt scheint (die doppelte [[ sollte sagen, dass wir tatsächlich ein String[][] Objekt übergeben), aber aus irgendeinem Grund .jcall kann es nicht finden.

in rJava Verfahren können jedoch auch die Methode try2dStringArray aufgerufen wird, korrekt mit der Syntax obj$method(arg1,arg2,...), und auf diese Weise aufgerufen werden:

obj$try2dStringArray(.jarray(stringMatrix, dispatch = T)) 
#2 
+0

Also, das ist ein Fehler von rJava, oder? mit .jcall funktioniert es, mit obj $ try .. es tut ... – Julian