Pergunta

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.

Foi útil?

Solução

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))
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top