【问题标题】:How to pass an Array from java to R如何将数组从java传递到R
【发布时间】:2018-02-04 02:28:05
【问题描述】:

我正在使用 RServe() 并尝试将数组列表从 java 传递到 R。我收到一个错误,包括程序代码和我给出的错误。

String vector = "c(1,2,3,4)";
connR.eval("meanVal=mean(" + vector + ")");
double mean = connR.eval("meanVal").asDouble();
System.out.println("The mean of given vector is=" + mean);
ArrayList fDataset = (ArrayList)f.FDataset;
connR.eval("library(forecast)");
connR.eval("library(tseries)");
System.out.println(fDataset.toString());
connR.assign("myData",fDataset.toString());
System.out.println("*************myData ******************");   
System.out.println(connR.eval("myData"));
connR.eval("timeSeries <- ts(myData,start=1,frequency=7)");
System.out.println("this is time series object : " + connR.eval("timeSeries"));
connR.eval("fitModel <- auto.arima(timeSeries)");
REXP fc = connR.eval("forecast(fitModel, n=3)");
System.out.println("this is the forecast output values: " + fc);

我得到的输出为

The mean of given vector is=2.5

[0, 0, 2, 1, 2, 10, 21, 0, 0, 3, 6, 5, 11, 51, 0, 11, 8, 6, 24, 25, 104, 0, 0, 6, 4, 5, 25, 71]
*************myData ******************

org.rosuda.REngine.REXPString@3c873c87[1]
this is time series object : org.rosuda.REngine.REXPString@4e774e77+[1]
org.rosuda.REngine.Rserve.RserveException: eval failed, request status: 
error code: 127
at org.rosuda.REngine.Rserve.RConnection.eval(RConnection.java:234)
at forecast.ForecastAction.calculateForecast1(ForecastAction.java:323)
at forecast.ForecastAction.action(ForecastAction.java:140)
at forecast.ForecastAction.runApp(ForecastAction.java:83)
at forecast.ForecastAction.main(ForecastAction.java:36)

错误在一行

connR.eval("fitModel <- auto.arima(timeSeries)");

【问题讨论】:

  • 数据中可能有空值:stackoverflow.com/questions/21907545/…
  • 我也打印了数据,没有null。不应该有。我担心的是我是否正确使用了这一步 connR.assign("myData",fDataset.toString())

标签: java r rserve


【解决方案1】:

auto.arima 出现错误,因为另一行出现错误。特别是:

connR.assign("myData",fDataset.toString());

您为myData 变量分配了一个字符串值。因此,assign 之后的所有内容都毫无意义,timeSeries 只需使用一个 character 点创建即可。

使用.assign(Symbol symbol, double[] d) 进行适当的分配,它会起作用。

我已经更改了代码,现在它可以工作了。我不确定您拥有的f 变量是什么,您只需将ArrayList 转换为double[],然后再分配给RServe。

RConnection c = new RConnection();

double[] list = {0, 0, 2, 1, 2, 10, 21, 0, 0, 3, 6, 5, 11, 51, 0, 11, 8, 6, 24, 25, 104, 0, 0, 6, 4, 5, 25, 71};

c.eval("library(forecast)");
c.eval("library(tseries)");

c.assign("myData", list);

c.eval("timeSeries <- ts(myData,start=1,frequency=7)");
c.eval("fitModel <- auto.arima(timeSeries)");
REXP fc = c.eval("forecast(fitModel, n=3)");

double[] res = fc.asList().at("mean").asDoubles();
System.out.println("this is the forecast output values: " + Arrays.toString(res));

c.close();

// this is the forecast output values: [0.0, 0.0, 6.0, 4.0, 5.0, 25.0, 71.0, 0.0, 0.0, 6.0, 4.0, 5.0, 25.0, 71.0]

【讨论】:

  • 非常感谢。 m0nhawk。我现在明白了。不过,我有一个天真的问题。我在 R 中运行了相同的列表并得到了一些不同的结果。想知道为什么会这样 > mydata = c(0.0, 0.0, 2.0, 1.0, 2.0, 10.0, 21.0, 0.0, 0.0, 3.0, 6.0, 5.0, 11.0, 51.0, 0.0, 11.0, 8.0, 6.0, 24.0, 25.0, 104.0, 0.0, 0.0, 6.0, 4.0, 5.0, 25.0, 71.0) > timeSeries fitModel forecast(fitModel, n=3) 点预测 5.000000 5.142857 5.285714 5.428571 5.571429 5.714286 5.857143 6.000000 6.142857
  • 但同样,您的回答将指导人们如何处理 R 和 R 的数组。谢谢。
  • @BiswajitJana 我看到的是你有 mydatamyData 变量。你在第二个电话上打电话给ts。我认为您的 myData 具有不同的值,因此它会产生不同的预测。
  • 我的愚蠢。我从 R 中的预测对象中提取了错误的列表.....程序完全没问题。请忽略。其他开发人员注意:-,Forecast 对象包含几个列表。 fc.asList().at("mean").asDoubles() 提供点预测的列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多