在R中使用rJava的Java Wrapper

时间:2015-10-06 15:14:32

标签: java r rjava

我使用rJava包在R中为java implementation创建一个包装器。目前,我想为 GeneralizedSuffixTree 的两个方法(put和search)创建一个包装器提到的Java实现中存在的类。

search()GeneralizedSuffixTree方法的签名是

public Collection<Integer> search(String word){
        return search(word, -1);
    }

相应地,我创建了一个以下包装器方法:

   callsearch <- function(key){
     hook2 <- .jnew("GeneralizedSuffixTree") # instance of class
     out <- .jcall(hook2,"Ljava/lang/Object","search",as.character(key), evalArray= FALSE, evalString = FALSE)
     return(out)
}

因此,每当我使用callsearch("abcdea")从rstudio调用搜索方法时,我都会遇到以下错误

Error in .jcall(hook2, "Ljava/lang/Object", "search", as.character(key),  : 
  method search with signature (Ljava/lang/String;)Ljava/lang/Object not found

我想我正在为R中的Integer集合做一些错误的演员。我可以知道我做错了吗?

完整的欠开发包装程序包存在于link

1 个答案:

答案 0 :(得分:3)

问题在于JNI类型。由于搜索方法返回一个集合,因此集合JNI指定为Ljava/util/Collection;

因此正确的包装方法是:

callsearch <- function(key){
     hook2 <- .jnew("GeneralizedSuffixTree") # instance of class
     out <- .jcall(hook2,"Ljava/util/Collection;","search",as.character(key), evalArray= FALSE, evalString = FALSE)
     return(out)
}

其他信息:对于任何java类,可以在命令提示符下找到JNI类型

 javap -s <java-classname>

收藏示例:javap -s java.util.Collections