我正在准备一个我自己没有写过的java代码的R包装器(实际上我并不认识java)。我试图第一次使用rJava,我正在努力让.jcall正确。
以下是我编写包装器的java代码的摘录:
public class Model4R{
[...切...]
public String[][] runModel(String dir, String initFileName, String[] variableNames, int numSims) throws Exception {
[...切...]
dir和initFileName是具有初始条件的目录和文件名的字符串,变量名是我在R:c中编写的字符串列表(" var1",&#34 ; var2"," var3",...),长度可以从1到5。最后,numSim是一个整数。
这是我的包装函数的暂定R代码:
runmodel <- function(dir, inFile, varNames, numSim){
hjw <- .jnew("Model4R")
out <- .jcall(hjw, "[[Ljava/lang/String", "runModel", as.character(dir), as.character(inFile), as.vector(varNames), as.integer(numSim))
return(out)
}
R中的错误是:
Error in .jcall(hjw, "[[Ljava/lang/String", "runModel", as.character(dir),
: method runModel with signature (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II)[[Ljava/lang/String not found
我怀疑JNI类型对于String [] []是不正确的。无论如何,任何可以指导我找到解决方案的帮助都会受到欢迎!
答案 0 :(得分:1)
你在字符串[] []的JNI末尾错过了一个分号 - 它应该是"[[Ljava/lang/String;"
。另外,我认为您需要在.jarray
上致电as.vector
而不是varNames
。 R错误告诉你rJava认为第三个参数的类是Ljava/lang/String;
而不是[Ljava/lang/String;
。