如何使用 Rserve 在 Java 中获取 data.frame
How to get data.frame in Java using Rserve
我在我的项目中使用 Twitter anomaly detection algorithm。为此,我在 Java[=33 中将 Rserve 库用于 运行 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中打开这个文件并解析结果。
那么,如何使用 data.frame 结构的 Rserve 可能性得到 Java 中的输出结果?
只需编写 R 命令,使其 return 返回所需结果 Java:
RList l = c.eval("AnomalyDetectionTs(data, direction='both',
plot=FALSE, longterm=TRUE)$anoms").asList();
您得到的是包含两个变量 timestamp
和 anoms
.
的数据框(作为列表)
但是,AnomalyDetectionTs
returns 的日期格式非常烦人且效率低下,因此您可能想要 return 一个更理智的结果,在 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,它会更快地给你答案。
我在我的项目中使用 Twitter anomaly detection algorithm。为此,我在 Java[=33 中将 Rserve 库用于 运行 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中打开这个文件并解析结果。
那么,如何使用 data.frame 结构的 Rserve 可能性得到 Java 中的输出结果?
只需编写 R 命令,使其 return 返回所需结果 Java:
RList l = c.eval("AnomalyDetectionTs(data, direction='both',
plot=FALSE, longterm=TRUE)$anoms").asList();
您得到的是包含两个变量 timestamp
和 anoms
.
但是,AnomalyDetectionTs
returns 的日期格式非常烦人且效率低下,因此您可能想要 return 一个更理智的结果,在 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,它会更快地给你答案。