我正在为一个项目使用 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 的示例相当有限。谁能给我一个关于如何改进此代码的建议?
谢谢
最佳答案
我找到了一个解决方案,只是让它更友好一点,还附上了源链接。
评论:它是即用型实用方法。它基于 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 - 通过 Rserve 将 Java 中的多维数组分配给 R,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13089356/