使用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循环中打印似乎总是延迟到循环之后。
有没有办法确保笔记本实时输出打印报表的结果?
答案 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)
R版本对我有用:
cat(paste0('Your text', '\r'))
显然\r
将触发刷新。
答案 2 :(得分:1)
这不再是问题。下面的代码现在在 jupterLab 中工作
for(x in 1:10){
print(x)
flush.console()
Sys.sleep(0.2)
}