如何使用Rserve在Java中获取数据框(data.frame)

4

我在我的项目中使用了Twitter异常检测算法。为此,我使用Rserve库在我的Java应用程序中运行R代码。

我的Java代码:

RConnection connection = new RConnection();
connection.voidEval("library(AnomalyDetection)");
connection.eval("res <- AnomalyDetectionTs(data.frame(/*list of timestamps*/,/*list of values*/), direction='both', plot=FALSE, longterm=TRUE)");

因此,我得到了以下输出:

    $anoms
              timestamp    anoms
1   1980-09-25 16:05:00  21.3510
2   1980-09-29 06:40:00 193.1036
3   1980-09-29 21:44:00 148.1740

为了立即获得结果,我正在使用这个不太好的解决方案: connection.eval("write.csv(res[['anoms']],file='anom.csv')"); 然后,我在Java中打开此文件并解析结果。
那么,如何使用Rserve的data.frame结构在Java中获取输出结果?
1个回答

4

只需编写R命令,使其将所需结果返回给Java:

RList l = c.eval("AnomalyDetectionTs(data, direction='both',
                 plot=FALSE, longterm=TRUE)$anoms").asList();

您将获得一个数据帧(作为列表),其中包含两个变量timestampanoms
然而,AnomalyDetectionTs返回的日期格式非常烦人且效率低下,因此您可能希望返回更合理的结果,以便在Java中更轻松地使用,例如:
RList l = c.eval("{ res <- AnomalyDetectionTs(data, direction='both', plot=FALSE,
                          longterm=TRUE)$anoms;
                  list(as.POSIXct(res$timestamp), res$anoms) }").asList();
double ts[] = l.at(0).asDoubles();
double anom[] = l.at(1).asDoubles();
for (int i = 0; i < ts.length; i++)
    System.out.println(new java.util.Date((long)(ts[i]*1000.0)) + ": " + anom[i]);

附注:Rserve相关问题的正确咨询地点是stats-rosuda-devel邮件列表,您将获得更快的答案。


非常好,谢谢。 - Yakiv Holovko
这个功能非常好用,但是我们为什么不使用RVector来代替RList呢? - Madhavi Jouhari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接