【问题标题】:Where do I start with rJava?我从哪里开始使用 rJava?
【发布时间】:2011-08-12 12:34:25
【问题描述】:

我不是 Java 程序员。我编程 R 和 C++。我有一些想要包含在 R 包中的 java 代码。该程序的基础是这样的:

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

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

具体我有以下问题。

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

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

【问题讨论】:

  • 嗨 Andrew——CRAN 上的 rJava 页面列出了几十个使用它的包。也许你可以戳一下那些人,看看他们是怎么做的?
  • @JDLong 有一个很好的例子来计算地球表面的太阳辐射。也许他可以插入并指出源代码(也许在 github 上搜索“cmastication”。

标签: r rjava


【解决方案1】:

这在 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

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

【讨论】:

  • 由于您的个人资料中有链接 www.deducer.org,因此您还应该在回答中提及您隶属于您提议的产品/解决方案。
  • 很公平。我已添加披露声明。
【解决方案2】:

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

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$

祝你好运,如果遇到具体问题,一定要大喊大叫。

【讨论】:

  • 谢谢,这应该给了我一切所需的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多