Разговор с 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, но он хорошо работает и имеет хорошие показатели.