在我的java类中,我编写了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[][]
的区别如何?如何解决?
答案 0 :(得分:2)
起初,我认为.jarray
无法从String[][]
R character
正确创建matrix
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[][]
对象),但由于某种原因{{1}找不到它。
但是,在.jcall
方法中,也可以使用语法rJava
调用方法,并以这种方式正确调用方法obj$method(arg1,arg2,...)
:
try2dStringArray