【问题标题】:How to get interactive R output in Jupyter (IPython, rpy2), e.g. for a progress bar?如何在 Jupyter (IPython, rpy2) 中获取交互式 R 输出,例如进度条?
【发布时间】:2023-06-25 02:21:01
【问题描述】:

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

  • 我怎样才能让它工作?
  • 如果还不可能,我该如何在 rpy2 端实现此功能(我已经知道如何在 Jupyter/IPython 端创建交互式输出/小部件)?

这是来自rfunction.com的进度条的简单sn-p:

%%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 的所有优点。

【问题讨论】:

    标签: python jupyter rpy2 jupyter-lab ipython-magic


    【解决方案1】:

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

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

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

    第二步本质上是对 R C API 的调用,GIL 使该过程发生的唯一活动。但是,rpy2 正在定义默认回调,将 R 的打印重新路由到终端/控制台到 Python 自己的 print(),这就是为什么您在调用 robjects.r() 时看到打印的原因。

    我看到R magic is caching the R output,虽然有一个属性cache_display_data 应该控制它,但它没有被使用。这是错误,因为您在 * 上询问,并且因为 R 代码块打印很多会使用比需要更多的内存(甚至耗尽所有 RAM)。我不知道它是一直存在还是在代码重构期间引入的;现在在这里跟踪它:https://bitbucket.org/rpy2/rpy2/issues/543

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

    【讨论】:

    • 已测试 3.0.3,它对我有用。谢谢! PS。票的链接不起作用(除非我们删除“编辑”部分)。
    • 谢谢。答案中的链接已修复。
    最近更新 更多