Функция rJava startMainLoop () убивает операции Java - PullRequest
0 голосов
/ 12 декабря 2011

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

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

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

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

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

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

re.startMainLoop();

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

newVariable<-data$column1

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

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

Аран

1 Ответ

0 голосов
/ 22 декабря 2011

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

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

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

...