从rJava中的Java对象访问数据

时间:2013-07-09 19:49:01

标签: 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矩阵

  

数据[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)

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

1 个答案:

答案 0 :(得分:2)

您的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))