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

rJava:传递二维字符串数组作为函数输入,r,rjava,R,Rjava,在我的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) { Sy

在我的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))

在这种情况下,
String[][]
double[][]
有何不同?我该如何修复它?

起初,我认为
.jarray
无法从
字符
R
矩阵
正确创建
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
)似乎是正确的(double
[[
应该说我们实际上传递了一个
字符串[][]
对象),但由于某种原因
.jcall
找不到它

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

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

.jarray(lappy(apply(stringMatrix,1,函数(x)lappy(x,.jnew,class=“java/lang/String”),.jarray))
是否创建一个适合您的方法的
String[][/code>java对象?@nicola它似乎不起作用:
在.jcall(obj,“V”,“try2dStringArray”,.jarray(lappy)(apply(stringMatrix,:方法try2dStringArray和签名([Ljava/lang/Object;)V未找到
似乎您得到的是
Object[][]
而不是
String[][]
。我查看了
.jarray
的文档,可能使用参数
contents.class
将解决:
.jarray(apply(stringMatrix,1.jarray),contents.class=“java/lang/String”)
。我还简化了一点命令。希望这能起作用。@nicola它也不起作用:
在.jcall(obj,“V”,“try2dStringArray”和.jarray中出错(apply(stringMatrix,:带有签名的方法try2dStringArray([Ljava/lang/String;)V not found
我所做的尝试是错误的。但这里有一些错误:如果你尝试
obj$try2dStringArray(.jarray(stringMatrix,dispatch=T))
它应该可以工作(至少,它对我有效,打印
2
).也许这是
.jcall
中的一个bug。所以,这是rJava的一个bug,不是吗?使用.jcall,它可以工作,使用obj$try..它可以。。。
obj$try2dStringArray(.jarray(stringMatrix, dispatch = T))
#2