I have been trying to learn rJava to pass data back and forth between a set of Java applications I have programmed and R for analysis. I have a Java method with the signature

public double[][] method(void)

what I am going in R is as follows

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

At this point I have data that is supposed to contain the matrix I need to use but I am not understanding how to turn data from a Java matrix to a rJava matrix

data[1]

returns

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

I have tried

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

I am sure that what I am missing is obvious, but I just can't get it to work.

有帮助吗?

解决方案

Your Java method is returning an array of arrays. For some reason, rJava's coercion is confused by that, so you'll have to help it along.

Individual rows can be converted like this:

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

This came out transposed from what I expected:

r_matrix <- sapply(data, .jevalArray)

This seems to work as expected:

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

For what it's worth, the Java code I used to test this out is here:

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()));
    }
}

And, for completeness, on the R side:

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))
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top