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

时间:2016-06-07 21:28:47

标签: r jupyter output-buffering

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

相比之下,当我在一个jupyter笔记本中使用R时,所有打印只在循环完成后才会发生。

data <- data.frame(cat = sample(1:4, 100, replace=TRUE), string = sample(c("dog", "cat", "horse", "frog", "liger", "ligon", "tigon"), 100, replace = TRUE))

我试图用

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

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

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

3 个答案:

答案 0 :(得分:5)

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

潜在问题出现在https://github.com/IRkernel/IRkernel/issues/3中,建议的修正案位于https://github.com/hadley/evaluate/pull/62 - &gt;它需要evaluate中的更改才能允许flush.console()和朋友一起工作。问题的要点:我们使用evaluate来执行代码并一次评估输出一个语句并在语句完成后处理输出 。不幸的是,在这种情况下,for循环只是一个语句(就像{...}块中的所有内容一样),因此打印输出仅在完成for循环后出现在客户端中。

解决方法是使用IRdisplay包和display_...()函数而不是print()/cat()(或plots ...)。但这需要完全控制打印的东西:它要么都是使用print(并且它会在完成语句完成之后被延迟),或者在该语句中不应该打印(或绘图)。如果被调用的函数打印出某些内容,则输出的顺序将错误({print("a"); display_text("b"); print("c")}最终将为b a c)。使用capture.output()可能会让你解决这个限制,如果你真的需要...如果你使用情节,除了将情节写入光盘并通过display_png(..)和朋友发送之外还有are currently no workarounds

答案 1 :(得分:1)

Python Flush output in for loop in Jupyter notebook的答案的

R版本对我有用:

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

显然\r将触发刷新。

答案 2 :(得分:1)

这不再是问题。下面的代码现在在 jupterLab 中工作

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