Как получить интерактивный вывод R в Jupyter (IPython, rpy2), например, для индикатора выполнения? - PullRequest
0 голосов
/ 04 мая 2019

Я пытаюсь использовать встроенный индикатор прогресса 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.

1 Ответ

1 голос
/ 05 мая 2019

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

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

  1. Параметры в строке %%R оцениваются, и возможная настройка перед выполнением оценки кода R (например, использование локального преобразователя, преобразование входных параметров и т. Д.) *
  2. Код R в остальной части ячейки %%R оценивается в R "Global Environment" как строка кода
  3. Настройка выхода запускается и результаты возвращаются

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

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

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

...