【问题标题】:Accessing data from Java object in rJava从 rJava 中的 Java 对象访问数据
【发布时间】:2013-07-09 19:49:01
【问题描述】:

我一直在尝试学习 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)

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

【问题讨论】:

    标签: java r rjava


    【解决方案1】:

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

    【讨论】:

    猜你喜欢
    • 2013-10-09
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多