编程语言
首页 > 编程语言> > 如何使用Rserve在Java中获取data.frame

如何使用Rserve在Java中获取data.frame

作者:互联网

我在我的项目中使用了Twitter anomaly detection algorithm.为此,我使用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’]],文件= ‘anom.csv’)”);

然后我用Java打开这个文件并解析结果.

那么,如何使用Rserve对data.frame结构的可能性来获得Java的输出结果呢?

解决方法:

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

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

你得到的是具有时间戳和anoms两个变量的数据框(作为列表).

但是,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]);

PS:Rserve问题的正确位置是stats-rosuda-devel mailing list,它会更快地给你答案.

标签:java,r,rserve
来源: https://codeday.me/bug/20190623/1270977.html