簡體   English   中英

通過Rserve將Java中的多維數組分配給R.

[英]Assigning an multi-dimensional array from Java to R through Rserve

我正在使用Java / R / Rserve進行項目。 我面臨的問題是將多維數組從Java轉移到R工作空間進行計算。 到目前為止, RConnection對象的assign方法只允許傳遞以下內容: 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的示例相當有限。 誰能給我一個關於如何改進這段代碼的建議?

謝謝

我找到了一個解決方案,只是讓它更友好一點,鏈接源也附加。

評論:它是隨時可用的實用方法。 它基於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,但是,這是

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函數,在全局中生成矩陣(或數據幀),如:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM