Как получить data.frame в Java с помощью Rserve

В своем проекте я использую алгоритм обнаружения аномалий в Twitter. Для этой цели я использую библиотеку Rserve для запуска кода R в моем приложении Java.

Мой 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 и анализирую результаты.

Итак, как получить результаты вывода на Java, используя возможности Rserve для структуры data.frame?


person Yakiv Holovko    schedule 21.12.2015    source источник


Ответы (1)


Просто напишите команду R так, чтобы она возвращала желаемый результат обратно в Java:

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

Вы получаете фрейм данных (в виде списка) с двумя переменными timestamp и 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. список рассылки, который даст вам ответы гораздо быстрее.

person Simon Urbanek    schedule 27.12.2015
comment
Превосходно. Спасибо - person Yakiv Holovko; 29.12.2015
comment
Это прекрасно работает, но есть ли причина, по которой мы не используем RVector вместо RList? - person Madhavi Jouhari; 17.01.2018