如何在 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(笔记本或实验室)中产生所需的输出,而是在完成后立即打印所有步骤(这使得进度酒吧没用)。两个问题:
- 我怎样才能让它发挥作用?
- 如果还不可能,我该如何在 rpy2 端实现此功能(我已经知道如何在 Jupyter/IPython 端实现交互式 output/widgets)?
这是来自 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 单元进行评估时会发生以下情况。
- 评估
%%R
行上的参数,并在评估 R 代码之前完成最终设置(例如,使用本地转换器、转换输入参数等...)
%%R
单元格其余部分中的 R 代码在 R "Global Environment" 中作为代码字符串求值
- 退出设置 运行 并返回结果
第二步本质上是对 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(可能今天发布)的一部分。
我正在尝试在 Jupyter 中使用内置的 R 进度条 (txtProgressBar
) 和 %%R
魔法。虽然它在 R 控制台或 RStudio 中执行时确实会产生漂亮的动画,但它不会在具有 rpy2 扩展名的 Jupyter(笔记本或实验室)中产生所需的输出,而是在完成后立即打印所有步骤(这使得进度酒吧没用)。两个问题:
- 我怎样才能让它发挥作用?
- 如果还不可能,我该如何在 rpy2 端实现此功能(我已经知道如何在 Jupyter/IPython 端实现交互式 output/widgets)?
这是来自 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
.
编辑:我现在使用的解决方法是通过 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 单元进行评估时会发生以下情况。
- 评估
%%R
行上的参数,并在评估 R 代码之前完成最终设置(例如,使用本地转换器、转换输入参数等...) %%R
单元格其余部分中的 R 代码在 R "Global Environment" 中作为代码字符串求值- 退出设置 运行 并返回结果
第二步本质上是对 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(可能今天发布)的一部分。