在 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)
}
使用 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
cat(paste0('Your text', '\r'))
显然 \r
会触发同花顺。
这不再是问题。以下代码现在可以在 jupterLab 中运行
for(x in 1:10){
print(x)
flush.console()
Sys.sleep(0.2)
}