-
Notifications
You must be signed in to change notification settings - Fork 5
Java R classic integration
R — язык программирования для статистической обработки данных и работы с графикой, а также свободная программная среда вычислений с открытым исходным кодом в рамках проекта GNU. Существует большое количество библиотек, которые обеспечивают взаимодействие R с другими языками, в частности с Java. Несмотря на то, что они предоставляют похожие возможности, они имеют свои плюсы и минусы.
Rserve является TCP / IP сервером, который позволяет другим программам использовать возможности R. Rserve работает в R и слушает запросы на к предварительно определенному порту. Это универсальный способ налаживания "общения" между двумя программами, так как Rserve поддерживает удаленное подключение, аутентификацию и передачу файлов. Хотя R не поддерживает многопоточность, Rserve может манипулировать несколькими R процессами одновременно. Код на Java, иллюстрирующий интеграцию с помощью Rserve:
RConnection c = new RConnection();
double d[] = c.eval("rnorm(10)").asDoubles();
Соединение RConnection не должно быть создано более, чем один раз в течение последующих команд.
Преимущества Rserve
- Быстрота - инициализация R не требуется;
- Бинарная транспортировка данных - транспортный протокол отправляет объекты R в виде двоичных данных;
- Автоматическое преобразование типа - большинство типов данных R преобразуются в нативные типы данных языка, например, результат rnorm(10) будет double[10] в Java;
- Стойкость - каждое соединение имеет свое собственное пространство имен и рабочую директорию. Каждый объект продолжает существование, пока соединение не будет закрыто. Клиент не должен сохранять промежуточные результаты;
- Безопасность - Rserve обеспечивает некоторую базовую безопасность, поддерживая шифрование пароля. Rserve может быть настроен только на локальные соединения;
- Настраиваемость - один файл используется для контроля параметров, включения и отключения функций, таких как авторизация, удаленный доступ или передача файлов.
Недостатки Rserve
- Rserve не предоставляет функциональность обратного вызова.
- Rserve thread-safe во время одного соединения, но eval методы не thread-safe. Это означает, что несколько потоков не должны использовать одно и то же соединение, если не гарантируют, что вызовы eval работают параллельно.
rJava - R-to-Java интерфейс, обеспечивающий низкоуровневый мост между R и Java через JNI(Java Native Interface), позволяющий создавать объекты, обращаться к методам и полям объектов Java из R. Инверсией rJava является JRI, который обеспечивает вызов R из Java. JRI поставляются как часть пакета rJava. Важным преимуществом rJava является возможность использования callbacks (функций обратного вызова).
Пример использования rJava из R:
library(rJava)
.jinit() # this starts the JVM
s <- .jnew("java/lang/String", "Hello World!")
Это эквивалентно следующей строчке в Java:
s = new java.lang.String("Hello World!");
Особенностями синтаксиса при создании объекта Java в R являются наличие "/" вместо "." в имени класса и использование полного имени класса, потому что нет возможности import ...
Java/R Interface, который позволяет запускать R из Java программы в одном потоке. Он загружает динамическую библиотеку R в Java и предоставляет Java API для функциональности R.
rJava является инверсией JRI, они могут быть объединены (например, можно запустить такой R код в JRI, который вызывает обратно JVM с помощью rJava). Такое объединение обеспечивает полный Java GUI для R.
JRI использует нативный код, поддерживает все платформы, для которых доступна Java, в том числе Windows, Mac OS X, Sun и Linux (32-бита и 64-бита).
JRI является частью rJava, поэтому достаточно установить rJava. Чтобы найти JRI установленный с rJava, используйте system.file("jri",package="rJava")
в R.
RCaller - библиотека для вызова R кода из Java. RCaller преобразует структуры данных в R код, отправляет их внешнему R процессу, возвращает сгенерированные результаты XML формате. Структура XML анализируется и возвращает значения доступные непосредственно в Java.
Можно создать отдельный процесс для каждой операции, но это приведет к снижению производительности. RCaller поддерживает последовательный вызов команд в одном R процессе.
Одним из главных достоинств RCaller является простота. RCaller зависит только от одного jar файла и не требует других настроек. Пример кода на Java:
RCaller caller = new RCaller();
caller.setRscriptExecutable("path/to/Rscript.exe");
double[][] matrix = new double[][]{{6, 4}, {9, 8}};
RCode code = new RCode();
// Passing Java objects to R
code.addDoubleMatrix("x", matrix);
code.addRCode("s <- solve(x)");
caller.setRCode(code);
// Performing Calculations
caller.runAndReturnResult("s");
// Passing R object to Java
double[][] inverse = caller.getParser().getAsDoubleMatrix("s", 2, 2);
Многократный вызов метода runAndReturnResult создает вычислительную нагрузку, поэтому последовательный вызов этого метода неудобен. В таком случае может быть использован runAndReturnResultOnline.
Рассматриваются 3 способа интеграции Java и R: Rserve, rJava и RCaller. Тестирование проводится на PC с 4GBs памяти и ОС Linux (Ubuntu).
Настройка проходит достаточно легко для Rserve и RCaller, первый требует добавления двух jar файлов, второй - одного. Настройка rJava чуть более сложна.
Создается массив целых чисел x размером 1000, затем этот массив передается в R, вычисляются значения x^2 и новый массив обрабатывается Java. Так как операции, выполняемые со стороны R, не влияют на результаты производительности средств интеграции, предпочтительными являются небольшие расчеты. Операции повторяются 100 раз для каждой библиотеки.
Статистика времени, потребляемого алгоритмами (в миллисекундах):
Выбор средства интеграции Java и R определяется особенностями проекта и набором задач, которые оно призвано решить.
- Rserve удобен для применения в клиент-серверных системах, он легко настраивается, поддерживает удаленное подключение и обеспечивает многопоточность, но не поддерживает обратный вызов.
- RCaller полезен в проектах с большим количеством клиентов и относительно небольшими вычислениями, легко настраивается, может запускать несколько R процессов, но проигрывает в скорости вычислений, в частности потому, что тратит время на преобразование данных в XML формат.
- rJava настраивается чуть сложнее, чем предыдущие средства интеграции, но обеспечивает самый обширный функционал. Поддерживает обратный вызов, показывает лучшие результаты по производительности.
rJava как начать работу
rServe как начать работу
RCaller: A Software Library for Calling R from Java
Rserve
rJava
JRI
- Project structure
- Heroku
- Coding Guidelines
- [Java](Coding Guidelines)
- Html
- Логирование (Java)
- Analyzers: [TEMPLATE]
- Общая схема вычисляемых функций
- Линейный коэффициент корреляции
- Уравнение линейной регрессии
- Анализ временных рядов
- Анализ одномерных временных рядов: вычисление тренда, сезонной и шумовой компонент несколькими способами
- Критерий Стьюдента
- Analyzers: Kolmogorov Smirnov Test for two samples
- Анализ главных компонент (Principal Component Analysis, PCA)
- Показатель Ляпунова для временных рядов
- Navigation
- REST API
- Классы - источники данных
- Добавление нового источника данных
- [Analyzers](Architecture of analize function)
- Analyzers (version 2)
- Пользователи, проекты и файлы
- Java R classic integration
- Renjin (R in JVM)
- R integration architecture
- R scripts
- RConfiguration
- Полезные функции в R
- Angular 2 in JavaScript
- Learning resources, etc.
- Angular 2 приложение проектов
- Точка входа для более быстрой разработки Angular 2 приложения
- Interpolation
- [Charts comparison](displaying graphs control)
- What is Servlet?
- Ace-editor
- Библиотека CoreArray
- Сборка CoreArray
- Сравнение скоростей способов доступа к CoreArray
- Переделка Gdsfmt под java
- Разбор структуры файла из центра биоинформатики