在 jupyter 中使用 R 实时打印到控制台

real-time printing to console with R in jupyter

使用 R GUI 或仅从命令行使用 R,此代码会导致以 0.2 秒的间隔打印整数。

相比之下,当我在 jupyter notebook 中使用 R 时,所有打印仅在循环完成后发生。

for(x in 1:10){
    print(x)
    Sys.sleep(0.2)
}

我尝试使用

强制在 Jupyter 内部进行实时打印
for(x in 1:10){
    print(x)
    flush.console()
    Sys.sleep(0.2)
}

...没有效果。结果是一样的——在 jupyter 的 for 循环中打印似乎总是被延迟到循环之后。

有没有办法保证notebook实时输出print语句的结果?

目前,"trigger" 处理打印输出的唯一方法是使用 message("text")(而不是 print("text")cat("text"))或不将其写入循环但在它自己的声明中。

根本问题在 https://github.com/IRkernel/IRkernel/issues/3 and a proposed fix is in https://github.com/hadley/evaluate/pull/62 -> evaluate 需要更改才能让 flush.console() 和朋友们工作。问题的要点:我们使用 evaluate 来执行代码并评估一次处理输出一个语句,并在 语句完成后处理输出 。不幸的是,在这种情况下,for 循环只是一个语句({...} 块中的所有内容也是如此),因此打印输出仅在 for 循环完成后才会出现在客户端中。

解决方法是使用 IRdisplay 包和 display_...() 函数而不是 print()/cat()(或 plots...). But this needs full control over the printed stuff: It's either everything is using print (and it gets delayed until after the complete statement is finished) or nothing should print (or plot) in that statement. If a called functions prints something, the output would be in the wrong order ({print("a"); display_text("b"); print("c")} would end up as b a c). Using capture.output() might get you around this limitation, if you really have to... If you use plots, there are currently no workarounds 除了将绘图写入光盘并通过 display_png(..) 和朋友们。

Python 的 R 版答案对我有用:

cat(paste0('Your text', '\r'))

显然 \r 会触发同花顺。

这不再是问题。以下代码现在可以在 jupterLab 中运行

for(x in 1:10){
    print(x)
    flush.console()
    Sys.sleep(0.2)
}