如何在 Jupyter (IPython, rpy2) 中获得交互式 R 输出,例如进度条?

How to get interactive R output in Jupyter (IPython, rpy2), e.g. for a progress bar?

我正在尝试在 Jupyter 中使用内置的 R 进度条 (txtProgressBar) 和 %%R 魔法。虽然它在 R 控制台或 RStudio 中执行时确实会产生漂亮的动画,但它不会在具有 rpy2 扩展名的 Jupyter(笔记本或实验室)中产生所需的输出,而是在完成后立即打印所有步骤(这使得进度酒吧没用)。两个问题:

这是来自 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 安装它,需要使用 %load_ext rpy2.ipython.

在 Jupyter 中加载魔法

编辑:我现在使用的解决方法是通过 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)
}
""")

然而这并不理想——我更愿意保留 rpy2 的 Rmagic 的所有优点。

应该有一种方法可以实现这一点,因为 R 魔术正在调用 robjects.r()(就像您在解决方法中一样)。

简而言之,当您提交 %%R jupyter 单元进行评估时会发生以下情况。

  1. 评估 %%R 行上的参数,并在评估 R 代码之前完成最终设置(例如,使用本地转换器、转换输入参数等...)
  2. %%R 单元格其余部分中的 R 代码在 R "Global Environment" 中作为代码字符串求值
  3. 退出设置 运行 并返回结果

第二步本质上是对 R C API 的调用,GIL 使该过程中唯一的 activity 发生。但是,rpy2 正在定义默认回调,将 R 的打印重新路由到 terminal/console 到 Python 自己的 print(),这就是为什么你看到打印的原因,因为代码是 运行ning你打给 robjects.r().

的电话

我看到 R magic is caching the R output, and while there is an attribute cache_display_data that should control this is it not used. This is bug, for the reason your are asking on Whosebug, and because an R code block printing a lot would use more memory than needed (and even exhaust all RAM). I do not know whether it has always be present or it was introduced during code refactoring; it is now tracked here: https://bitbucket.org/rpy2/rpy2/issues/543

编辑: 该修复程序现已在存储库中,并将成为 rpy2-3.0.3(可能今天发布)的一部分。