rJava:传递二维字符串数组作为函数输入
在我的java类中,我编写了3个测试函数,如下所示: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
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