如何将一个float / double数组作为一个向量从JAVA通过RServe发送给R.

时间:2016-06-28 04:11:57

标签: java r postgresql rserve

我使用 R Java Rserve , 我想在R中使用预测 w.r.t ARIMA ,但用于预测的值/数据存在于 postgres 数据库中。 我也知道我可以直接在R中使用 RPostgreSQL 来从DB获取数据,但是在发送到RI之前想要在JAVA中处理DB数据我想转移到R,所以对于这个我能够从 postgres DB 获取数据,然后我立即处理原始的float / double数组类型,我试图通过'Rserve'发送给R 并且它正在抛出语法错误异常。我对这个R完全不熟悉,我发现很难做到这一点。 请任何人审核问题并评论您的建议。

为了更好地理解,请查看以下代码段:

List<Float> xfval = new ArrayList<Float>();
Statement data_statement = dbComp.createStatement();
String command = "SELECT * FROM to_forecast";
ResultSet res=data_statement.executeQuery(command);
while(res.next())
{
   xfval.add(res.getFloat("values"));
}
/*
 *
 Here I have process data of 'xfval'
 w.r.t to condition but I'm not disclosing any
 logic w.r.t to processing
 * 
 *
 */ 

RConnection connection = new RConnection();
String load_pkgs = "require(Rserve); require(forecast)";
connection.eval(load_pkgs);
float[] floatArray = ArrayUtils.toPrimitive(xfval.toArray(new Float[0]), 0.0F);

 //below line is that where I'm getting the syntax error exception
connection.eval("xData=("+floatArray+")").asDouble();
String strx2 = "x = xData[1:100,1];";
connection.eval(strx2);
/*the code continues*/

我还希望直接在 JAVA 中使用 ARIMA 预测技术,而不使用 R 。 我选择R的事情是R可以执行ARIMA和预测技术。如果有任何开源API或JAVA库让我尽快。

对于Exception详细信息,我附在图片下方:

Exception for Syntax Err

谢谢

1 个答案:

答案 0 :(得分:2)

正如您在RConnection文档中所看到的,eval函数将String作为其参数。因此,您需要创建一个格式正确的R。

的String

这可能有效:

    String rVectorStr="";
    for(int i=0;i<floatArray.length;i++) {
        if(i==floatArray.length-1)
            rVectorStr=rVectorStr.concat(String.valueOf(floatArray[i]));
        else
            rVectorStr=rVectorStr.concat(String.valueOf(floatArray[i])+",");
    }
    //System.out.println(rVectorStr);
    connection.eval("xData=c("+rVectorStr+")");
    String strx2 = "x = xData[1:100,1];";

as.Double()用于接收输出(在评估eval()内发送的字符串后由R生成),并将它们存储为Java Double类型。它不是将Double数组发送给R的东西.Rserve中没有这样的方法。