2

私は、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)

私が欠けているのは明らかだと確信していますが、それを機能させることはできません。

4

1 に答える 1

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))
于 2013-07-10T01:13:53.627 に答える