4

我正在为一个项目使用 Java/R/Rserve。我面临将多维数组从 Java 传输到 R 工作区进行计算的问题。到目前为止,对象的assign方法RConnection只允许传递以下内容:byte[], double[], int[], REXP, String,and String[].

我通过在 Java 中创建一个循环来回避这一点,并单独传递变量。尽管这可行,但它看起来丑陋且效率低下。

RConnection c = new RConnection();
c.eval("x <- matrix(0,nrow=dimX[1],ncol=dimX[2])");
for (int i = 0; i < dimX[0]; i++){
  c.assign("i",Integer.toString(i+1));
  c.eval("i <- as.numeric(i)");
  for (int j = 0; j < dimX[1]; j++){
    c.assign("j",Integer.toString(j+1));
c.eval("j <- as.numeric(j)");
c.assign("tmp", Double.toString(XOBS[i][j]));
c.eval("x[i,j] <- as.numeric(tmp)");
  }             
}

http://www.rforge.net/Rserve/dist/JRclient/JavaDoc/org/rosuda/JRclient/REXP.html上的 Rserve 文档似乎已经过时,并且 Rserve 的示例相当有限。谁能给我一个关于如何改进这段代码的建议?

谢谢

4

4 回答 4

2

供参考(在提出问题时方法可能尚不可用):

REXP REXP.createDoubleMatrix(double[][] arg);
于 2014-10-23T10:20:57.523 回答
2

我找到了一个解决方案,只是让它更友好一点,还附上了源链接。

评论:它是现成的实用方法。它基于 JRI,现在是 rJava 的一部分。

来源:
http ://www.lbgi.fr/wikili/index.php/JRI

    /**
     * Creates and assigns a matrix object in R from 2D table of double
     *
     * @param rEngine        the  R instance used
     * @param sourceArray    the 2D table of double
     *                       the matrix must have always the same column number on every row
     * @param nameToAssignOn the R object name
     * @return R matrix instance or null if R return an error
     */
    public static REXP assignAsRMatrix(Rengine rEngine, double[][] sourceArray, String nameToAssignOn) {
        if (sourceArray.length == 0) {
            return null;
        }

        rEngine.assign(nameToAssignOn, sourceArray[0]);
        REXP resultMatrix = rEngine.eval(nameToAssignOn + " <- matrix( " + nameToAssignOn + " ,nr=1)");
        for (int i = 1; i < sourceArray.length; i++) {
            rEngine.assign("temp", sourceArray[i]);
            resultMatrix = rEngine.eval(nameToAssignOn + " <- rbind(" + nameToAssignOn + ",matrix(temp,nr=1))");
        }

        return resultMatrix;
    }
于 2014-04-13T16:39:00.607 回答
1

如果你做这样的事情(根据你的需要改变行号和行号)怎么办?

RConnection c = new RConnection();

double[][] test = { { 1.0D, 2.0D }, { 3.0D, 4.0D } };

c.assign("res", test[0]);
for (int i = 1; i < 2; i++) {
  c.assign("tmp", test[i]);
  c.eval("res<-rbind(res,tmp)");
}

REXP x = c.eval("sum(res)");
System.out.println(x.asString());

正如预期的那样,这将返回 10,但是,这

String s = c.eval("rowSums(res)").asString();
System.out.println(s);

没有打印出它假设的内容,它只是返回3,也许我的 Ubuntu 安装的 RServe 已损坏并且无法打印结果字符串中空格之后的任何内容3 7

> rowSums(d)
c1 c2 
3  7 

我也找不到好的例子:(

于 2012-10-27T07:04:32.050 回答
0

你可以:

  • 将数组展平为整数行向量,这样

    a11 a12

    a21 a22

=>

flat_array = new int[] {a11, a12, a21, a22}
  • 将其分配给局部变量,例如:

    rEngine.assign(".values", flat_array);

  • 调用在全局中创建矩阵(或数据帧)的 R 函数,例如:

在 R 中:

 make.matrix <- function(nrows, ncols, values) {

        value_mat <- matrix(values, nrow=nrows, ncol=ncols, byrow=TRUE)
        temp.res <<- res
        res
    }

在 Java 中:

rEngine.eval("make.matrix(2,2,.values)");
  • 现在你在 temp.res 有了矩阵
于 2014-05-15T00:49:15.983 回答