11

我不是 Java 程序员。我编程 R 和 C++。我有一些想要包含在 R 包中的 java 代码。该程序的基本情况如下:

  1. 从标准输入读取数据。
  2. 运行 MCMC 链。
  3. 输出到文件。

我想将它转换为 R,我可以在其中从 R 运行程序。我熟悉 Rcpp 包并且习惯了它的一些便利。我从哪里开始使用 rJava 包来学习使用此代码。

具体来说,我有以下问题。

  1. 如何将数据从 R 传输到 java,例如数字向量、因子等。
  2. 如何运行类的方法?
  3. 如何在包中包含 java 代码?

rJava 文档不是很有帮助。有人有这方面的教程吗?

4

2 回答 2

5

有一种“简单”的方法可以做到这一点,也有一种更难的方法来做到这一点。我是一个简单的人,所以我倾向于简单的解决方案:

myCommand <- paste("/path/to/java", argument1, argument2, sep=" ")
system(shQuote(myCommand))

然后使用任何有意义的 R 函数读入输出文件。

更难的解决方案是编辑您的 Java 代码,这样它就不会从标准输入中读取,而是传递一个向量或其他 Java 对象。我无法真正概括如何更改您的 Java 代码,但如果最终需要为 Java 函数提供一个向量,您可以这样做:

.jinit()
v <- .jnew("java/util/Vector")
rVector <- as.character(1:10)
addToV <- function( item ){
  v$add( item )
}
sapply(rVector, addToV)

正如您在上面看到的,我总是发现在 rJava 中处理类型是一件相当痛苦的事情。

一个可以为您节省大量时间的技巧是:当您在 rJava 中创建了一个 Java 对象时,您可以通过键入名称、美元符号,然后点击 tab 来找出它的方法。所以使用上面创建的 v 对象类型“v$”,你应该得到这个:

1> v$
v$add(                 v$hashCode()           v$contains(            v$size()               v$elementAt(           v$capacity()           v$containsAll(         v$firstElement()       v$removeElement(       v$iterator()           v$wait()
v$get(                 v$clone()              v$isEmpty()            v$toArray()            v$remove(              v$ensureCapacity(      v$removeAll(           v$insertElementAt(     v$removeElementAt(     v$listIterator()       v$getClass()
v$equals(              v$indexOf(             v$lastIndexOf(         v$toArray(             v$elements()           v$trimToSize()         v$retainAll(           v$lastElement()        v$setElementAt(        v$listIterator(        v$notify()
v$toString()           v$clear()              v$addAll(              v$addElement(          v$set(                 v$subList(             v$copyInto(            v$removeAllElements()  v$setSize(             v$wait(                v$notifyAll()
1> v$

祝你好运,如果你有特定的障碍,一定要大喊大叫。

于 2011-04-26T21:12:46.993 回答
3

这在 Deducer 插件开发文档中有介绍。虽然它适用于扩展 Deducer 的软件包,但有些部分是通用的。

在 R 中运行 java 方法:http: //www.deducer.org/pmwiki/pmwiki.php? n=Main.Development#wwjoir

将 R 对象引入 java 并使用 java 代码创建一个包:http: //www.deducer.org/pmwiki/pmwiki.php? n=Main.Development#suaptijc

完全披露:演绎者是我的项目。

于 2011-04-25T23:12:29.077 回答