java - 从 rJava 中的 Java 对象访问数据

标签 java r rjava

我一直在尝试学习 rJava,以便在我编写的一组 Java 应用程序和 R 之间来回传递数据以进行分析。我有一个带有签名的 Java 方法

public double[][] method(void)

我在 R 中要做的事情如下

library("rJava")
.jinit(parameters="-Xmx10240m")
s <- .jarray("string", "mainArgs")
javaobj <- .jnew("JavaClass", s)
data <- .jcall(javaobj, "[[D", "method")

此时,我的数据应该包含我需要使用的矩阵,但我不明白如何将数据从 Java 矩阵转换为 rJava 矩阵

data[1]

返回

[[1]]
[1] "Java-Array-Object[D:"

我已经尝试过

as.list(data)
as.list(data[1])
as.list(data, simplify=TRUE)
.jsimplify(trees)
.jcastToArray(data)
.jevalArray(data)
.jevalArray(data, simplify=TRUE)

我确信我所缺少的东西是显而易见的,但我就是无法让它发挥作用。

最佳答案

您的 Java 方法正在返回数组的数组。由于某种原因,rJava 的强制转换对此感到困惑,因此您必须帮助它。

各个行可以这样转换:

r_vector <- .jevalArray(data[[1]])

这与我的预期不同:

r_matrix <- sapply(data, .jevalArray)

这似乎按预期工作:

r_matrix <- do.call(rbind, lapply(data, .jevalArray))

无论如何,我用来测试这个的 Java 代码在这里:

import java.util.Arrays;

public class Foo {

    public double[][] method() {
        double[][] data = { {1.1, 1.2, 1.3},
                            {2.1, 2.2, 2.3} };

        return data;
    }

    public double[] getArray() {
    double[] data = {9.9,8.8,7.7};
    return data;
    }

    public static void main(String[] args) {
        Foo foo = new Foo();
        System.out.println(Arrays.toString(foo.method()));
    }
}

并且,为了完整起见,在 R 端:

library(rJava)
.jinit()
.jaddClassPath(path='.')

foo <- new( J('Foo'))
data <- foo$method()
one_row <- .jevalArray( data[[1]] )
r_matrix <- sapply(data, .jevalArray)

r_matrix <- do.call(rbind, lapply(data, .jevalArray))

关于java - 从 rJava 中的 Java 对象访问数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17556910/

相关文章:

java - 在 Intellij 中,如何安全地重构循环中的 continue 语句?

r - 按多列排序不起作用 - R Dataframe

java - 使用 Java、R 和 JavaGD 绘制多个图形时出现问题?

java - Spring MVC 使用GenerateKeyHolder() - java.io.NotSerializedException

java - 如何分析大型堆转储?

java - Swing 动画暂停和恢复

r - 为什么 R "hashed"到 ${USER_HOME}/miniconda/bin/R?

r - 每个人具有多个/堆叠变量的热图

java - 将绘图从 R 调用到 Java 应用程序中

java - 通过 rJava 初始化 HashMap<String, Double>