Расширить приложение Java с помощью R? - PullRequest
11 голосов
/ 16 июля 2009

Я создаю приложение, которое я хочу расширить с помощью модулей, которые немного сокращаются, и я хотел бы иметь R для этого. Каковы мои лучшие варианты расширения моего Java-приложения с помощью R?

Ответы [ 6 ]

9 голосов
/ 16 июля 2009

Вы можете использовать JRI . С этого сайта:

JRI - это интерфейс Java / R, который позволяет запускать R внутри Java приложения в виде одного потока. В основном это загружает динамическую библиотеку R в Java и предоставляет Java API для R функциональность. Он поддерживает как простые вызовы функций R и полный работает REPL.

Это часть проекта rJava (который позволяет вызывать Java из R)

3 голосов
/ 14 марта 2012

Разговор с R из Java был стандартизирован с использованием REngine API. Для этого есть две реализации.

Первая реализация - JRI . Он основан на JNI и выполняет Rll внутри JVM. Это означает, что соединение очень быстрое. Вы можете использовать полную функциональность R, включая объекты, которые живут внутри R, но доступны / модифицируются в Java. Недостатком является невозможность использования многопоточности.

Вторая реализация - RServe . RServe состоит из сервера, написанного на C, вместе с клиентом Java. Сервер запускается из командной строки и включает в себя R dll. Затем Java-клиент устанавливает соединение через сокет и вызывает R в последовательном порядке. Эта реализация работает хорошо. Недостаток заключается в том, что в Windows компонент RServe не может работать самостоятельно для обработки нескольких соединений. Каждый экземпляр RServe может обслуживать только одного пользователя.

Альтернативная реализация, на которую стоит обратить внимание, - это клиент Java RMI, который вызывает сервер Java, вызывающий R, используя JRI. Идея заключается в том, что вы можете использовать многопоточность, потому что вы можете общаться с несколькими серверами одновременно. Смотри http://www.londonr.org/remoterengine-londonR.pdf

На практике мы использовали RServe вместе с большим количеством стандартного кода для запуска и управления экземплярами RServe. Это в основном крупный PITA, но он хорошо работает и имеет хорошие показатели.

2 голосов
/ 11 октября 2018

FastR - это реализация на основе GraalVM R. Встраивание его в приложение JVM так же просто, как:

Context ctx = Context.newBuilder("R").allowAllAccess(true).build();
ctx.eval("R", "sum").execute(new int[] {1,2,3});

Подробнее в этой статье: https://medium.com/graalvm/faster-r-with-fastr-4b8db0e0dceb

2 голосов
/ 22 июля 2009

У меня был хороший опыт интеграции JGR, Java Gui для R в мое Java-приложение.

Обратите внимание, что REngine не является многопоточным. Таким образом, вам необходимо сериализовать доступ к REngine (например, разрешив ему запускаться в своем собственном потоке). Ваше приложение и JGR обновят R-переменные и фреймы данных, используя JRI. Теперь большое преимущество использования JGR заключается в том, что консоль R доступна, чтобы пользователь мог получить доступ к данным, обновляемым через ваше приложение, поиграть с ними, даже изменить их на лету, построить их и т. Д .; Эта комбинация скомпилированного (Java) и интерпретируемого (R) режимов вполне удовлетворительна с точки зрения пользовательского опыта.

Кроме того, похоже, что проект JGR довольно жив; Я использовал JGR 1.4, сейчас он на 1.7 (обновлено в июне 2009 г.), поэтому обязательно загрузите его и попробуйте.

Если это работает хорошо, и вы становитесь амбициозными, посмотрите на биоцепс.

1 голос
/ 28 июля 2010

попробуй RCaller, http://www.mhsatman.com/rcaller.php

0 голосов
/ 12 октября 2018

В дополнение к FastR , упомянутому @Steves, есть также renjin , но что довольно похоже:

// create a script engine manager:
RenjinScriptEngineFactory factory = new RenjinScriptEngineFactory();
// create a Renjin engine:
ScriptEngine engine = factory.getScriptEngine();
engine.eval(new java.io.FileReader("script.R"));
...