通过rserve分配从Java到R的多维数组



我正在使用Java/r/rserve进行项目。我面临的问题是将多维阵列从Java转移到R Workspace进行计算。到目前为止,RConnection对象的assign方法仅允许传递以下内容:byte[], double[], int[], REXP, String,and String[]

i通过在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/org/rosuda/jrclient/rexp.html上的文档似乎已经过时了,而rserve的示例则相当有限。谁能给我一个关于如何改进此代码的建议?

谢谢

我找到了一个解决方案,然后使其更加友好,链接也附加了。

评论:这是现成的实用方法。它基于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;
    }

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

REXP REXP.createDoubleMatrix(double[][] arg);

如果您做这样的事情(为您的需要更改行和行号)?

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个返回10,但是,此

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

没有打印件,它只是返回 3,也许我的Ubuntu安装的rserve被打破了,无法在结果字符串3 7中打印出空间之后的所有内容:

> rowSums(d)
c1 c2 
3  7 

我也找不到很好的例子:(

您可以:

  • 将数组弄平到整数行的向量,以便

    A11 A12

    A21 A22

=>

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

    rengine.assign("。values",flat_array);

  • 调用R函数,该函数在全局中形成矩阵(或dataframe),例如:

在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中的矩阵

相关内容

  • 没有找到相关文章

最新更新