我正在使用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中的矩阵