【问题标题】:real-time printing to console with R in jupyter在 jupyter 中使用 R 实时打印到控制台
【发布时间】:2016-06-07 21:28:47
【问题描述】:

使用 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 循环中打印似乎总是延迟到循环之后。

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

【问题讨论】:

  • 这值得在IRKernel 上发布一个问题。在 python 中有针对它的 hack,但在 R 中没有。
  • 感谢您的提示。我确实提出了问题。后来,我找到了一个interesting related issue,它建议使用message() 而不是打印。

标签: r jupyter output-buffering


【解决方案1】:

目前,“触发”打印输出处理的唯一方法是使用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()(或plots...)。但这需要完全控制打印的内容:要么所有内容都在使用 print(并且它会延迟到完整的语句完成之后),要么在该语句中不应该打印(或绘图)。如果一个被调用的函数打印了一些东西,那么输出的顺序就会错误({print("a"); display_text("b"); print("c")} 最终会变成b a c)。使用capture.output() 可能会让你绕过这个限制,如果你真的必须...

【讨论】:

  • 谢谢。修复这个问题将是一个“很好的选择”,但最常见的用例可能是简单地将调试或跟踪语句添加到正在积极开发或需要很长时间运行的代码块。对于这种用途,message() 工作得很好。让图表按特定顺序显示似乎不太常见。
【解决方案2】:

Python Flush output in for loop in Jupyter notebook 答案的 R 版本适用于我:

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

显然\r 会触发刷新。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多