实时打印到控制台与R在jupyter



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

相比之下,当我在jupyter笔记本中使用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循环中打印似乎总是延迟到循环之后。

有没有办法确保笔记本实时输出打印报表的结果?

目前,"触发"处理打印输出的唯一方法是使用message("text")(而不是print("text")cat("text")),或者不将其写入循环,而是在自己的语句中。

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

一种解决方法是使用IRdisplay包和display_...()函数,而不是print()/cat()(或绘图…)。但这需要对打印的内容进行完全控制:要么所有内容都在使用打印(直到完整的语句完成后才会延迟),要么该语句中不应打印(或绘图)。如果被调用的函数打印一些东西,那么输出的顺序就会错误({print("a"); display_text("b"); print("c")}最终会变成b a c)。如果你真的必须这样做的话,使用capture.output()可能会让你绕过这个限制……如果你使用绘图,除了将绘图写入光盘并通过display_png(..)和朋友发送外,目前没有其他解决办法。

这不再是一个问题。以下代码现在在jupterLab 中工作

for(x in 1:10){
print(x)
flush.console()
Sys.sleep(0.2)
}
Jupyter笔记本中for循环中Python Flush输出的答案的R版本适用于我:
cat(paste0('Your text', 'r'))

显然r会触发刷新。

Jan Katins介绍了目前已经解决的相关问题,正如David Chen所写。

对于外部包最终依赖函数base::print()来连续中继信息的场景,可以在每个print():之后使用trace()进行刷新

trace(what = "print", where = getNamespace("base"), exit = flush.console, print = FALSE)

最新更新