编程语言
首页 > 编程语言> > 通过Rserve将Java中的多维数组分配给R.

通过Rserve将Java中的多维数组分配给R.

作者:互联网

我正在使用Java / R / Rserve进行项目.我面临的问题是将多维数组从Java转移到R工作空间进行计算.到目前为止,RConnection对象的assign方法只允许传递以下内容:byte [],double [],int [],REXP,String和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)");
  }             
}

Rserve on http://www.rforge.net/Rserve/dist/JRclient/JavaDoc/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;
    }

标签:java,r,rserve
来源: https://codeday.me/bug/20190620/1247240.html