Как получить интерактивный вывод R в Jupyter (IPython, rpy2), например. для индикатора выполнения?

Я пытаюсь использовать встроенный индикатор выполнения R (txtProgressBar) с магией %%R в Jupyter. Несмотря на то, что он создает красивую анимацию при выполнении в консоли R или RStudio, он не производит желаемого результата в Jupyter (ноутбуке или лаборатории) с расширением rpy2 вместо этого, печатая все шаги сразу после завершения (что делает прогресс бар бесполезен). Два вопроса:

  • Как я мог заставить его работать?
  • Если это пока невозможно, как мне реализовать эту функциональность на стороне rpy2 (я уже знаю, как сделать интерактивный вывод/виджеты на стороне Jupyter/IPython)?

Вот простой фрагмент индикатора выполнения с сайта rfunction.com:

%%R
SEQ  <- seq(1,100)
pb   <- txtProgressBar(1, 100, style=3)
TIME <- Sys.time()
for(i in SEQ){
  Sys.sleep(0.02)
  setTxtProgressBar(pb, i)
}

Для новичков в rpy2: его нужно установить с pip install rpy2, а магию нужно загрузить в Jupyter с %load_ext rpy2.ipython.

Редактировать: Обходной путь, который я использую на данный момент, заключается в ручном вызове кода через robjects.r:

from rpy2.robjects import r
r("""
SEQ  <- seq(1,100)
pb   <- txtProgressBar(1, 100, style=3)
TIME <- Sys.time()
for(i in SEQ){
  Sys.sleep(0.02)
  setTxtProgressBar(pb, i)
}
""")

однако это не идеально - я бы предпочел сохранить все преимущества Rmagic rpy2.


person krassowski    schedule 04.05.2019    source источник


Ответы (1)


Должен быть способ добиться этого, так как магия R вызывает robjects.r() (как вы используете обходной путь).

Короче говоря, когда вы отправляете ячейку %%R jupyter для оценки, происходит следующее.

  1. Оцениваются параметры в строке %%R и выполняется возможная настройка перед оценкой кода R (например, использование локального преобразователя, преобразование входных параметров и т. д.).
  2. Код R в остальной части ячейки %%R оценивается в «Глобальной среде» R как строка кода.
  3. Выполняется установка выхода и возвращаются результаты

Второй шаг — это, по сути, вызов R C API, который GIL делает единственным действием, происходящим с этим процессом. Тем не менее, rpy2 определяет обратные вызовы по умолчанию, которые перенаправляют печать R на терминал/консоль на собственный print() Python, поэтому вы видите печать, когда код выполняется в вашем вызове robjects.r().

Я вижу, что магия R кэширует R output, и хотя есть атрибут cache_display_data, который должен управлять этим, он не используется. Это ошибка по той причине, по которой вы спрашиваете о Stackoverflow, и потому, что блок кода R, печатающий много, будет использовать больше памяти, чем необходимо (и даже исчерпает всю оперативную память). Я не знаю, всегда ли он присутствовал или был введен при рефакторинге кода; теперь он отслеживается здесь: https://bitbucket.org/rpy2/rpy2/issues/543< /а>

Изменить: исправление уже находится в репозитории и станет частью rpy2-3.0.3 (вероятно, выпущенного сегодня).

person lgautier    schedule 05.05.2019
comment
Протестировал 3.0.3, и я знаю, что это работает. Благодарю вас! PS. ссылка на тикет не работает (если только мы не удалим часть редактирования). - person krassowski; 06.05.2019
comment
Спасибо. Ссылка исправлена ​​в ответе. - person lgautier; 06.05.2019