rJava:传递二维字符串数组作为函数输入

rJava: pass 2 dimensional string array as function input

在我的javaclass中我写了3个测试函数如下:

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

}

在 R 第一部分 运行 中:

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

只有最后一个错误:

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

在这种情况下,String[][]double[][] 有何不同?我该如何解决?

起初,我认为 .jarray 无法从 character R matrix 正确创建 String[][] java 数组。我错了,当 OP 中的代码是 运行 时收到的错误证明了这一点:

.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

可以看出,签名(([[Ljava.lang.String;)V)似乎是正确的(双[[应该说我们实际上传递了一个String[][]对象),但由于某种原因.jcall 找不到。

但是,在 rJava 中,方法也可以使用语法 obj$method(arg1,arg2,...) 调用,这样就可以正确调用方法 try2dStringArray

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