Функция rJava startMainLoop() убивает операции Java

Я разработал интерфейс, который позволяет пользователю загружать данные и управлять ими. Графический интерфейс разработан на Java, и все вычислительные операции выполняются в фоновом режиме с помощью R, связывающего их с помощью jri. Идея состоит в том, что пользователю не нужно знать R, чтобы использовать его, это все опции и кнопки. Однако я хотел бы дать пользователю возможность написать код, если это необходимо. Итак, вот моя проблема:

Если я использую следующий код для запуска Reengine и не позволяю пользователю взаимодействовать через консоль, все работает нормально:

    Rengine re=new Rengine(null, false, new TextConsole());

Но если я использую это:

    Rengine re=new Rengine(null, true, new TextConsole());

Функциональность графического интерфейса не работает. Я попытался использовать

re.startMainLoop();

функция после загрузки данных. Я смог манипулировать данными из командной строки в R, например, я мог создать новую переменную из столбца загруженных данных:

newVariable<-data$column1

Но опять же, я больше не мог использовать графический интерфейс. У кого-нибудь есть идеи или объяснения, почему это так?

Заранее спасибо,

Аран


person Aran Brady    schedule 12.12.2011    source источник


Ответы (1)


По сути, если REPL не запущен, R просто используется через eval вызовов из вашего кода. У вас есть контроль в любое время, за исключением фактической оценки. Это наиболее распространенное использование, потому что таким образом можно делать практически все что угодно.

В тот момент, когда вы включаете цикл событий (REPL), вы должны реализовать методы обратного вызова, используемые циклом. По дизайну R передает управление только путем вызова обратного вызова rReadConsole, который вы должны реализовать. Пример TextConsole работает только как демонстрация, он использует блокирующий вызов (readLine()) для ожидания, поэтому вы определенно не хотите использовать его в своем графическом интерфейсе. Вам нужно будет реализовать все обратные вызовы соответствующим образом, чтобы реагировать на элементы вашего графического интерфейса (подождите в ReadConsole, пока ваш графический интерфейс не разбудит его из отдельного потока, отправьте WriteConsole на ваши элементы и т. д.). Вы можете посмотреть на JGR, как это делается правильно. Если вы действительно не создаете графический интерфейс R общего назначения, я бы не стал влезать в эту проблему...

(PS: пожалуйста, используйте список рассылки stats-rosuda-devel для вопросов по rJava/JRI — вы получите ответы намного быстрее)

person Simon Urbanek    schedule 22.12.2011