我想知道是否可以更新R控制台中的现有文本?例如,如果我运行一个需要更长时间执行的函数,我想知道它当前有多远。
我可以通过在函数中的适当位置发出print("at 10%")
,print("at 20%")
等来实现此目的。但这可能是一个相对较长的输出,因为它每次产生一个新的线。
有没有办法从运行功能更新控制台文本,以便更新控制台中的当前行而不创建新行?例如。在适当的时候,控制台中的>at 10%
会更改为>at 20%
。
答案 0 :(得分:8)
刷新控制台可以正常工作,但可能会导致闪烁。如果您想要一个非常简单的文本行更新,那么只需打印\r
并在那里覆盖文本就可以返回到行的开头。
以下是rcane
module中的progress
函数:
progress <- function (x, max = 100) {
percent <- x / max * 100
cat(sprintf('\r[%-50s] %d%%',
paste(rep('=', percent / 2), collapse = ''),
floor(percent)))
if (x == max)
cat('\n')
}
以下是操作中进度条的屏幕截图:
最后,这可以很好地包装,以便它的使用毫不费力:
map_with_progress(some_function, some_data)
(请参阅上面的链接了解实现;当然R自己的txtprogressBar
更灵活。)
答案 1 :(得分:2)
虽然没有给出“是否有可能更新R控制台中的文本”这一问题的一般答案,但对我的特定问题没有必要。 Ananda和Dason在对我的问题的评论中提到的进度条是解决跟踪执行功能状态的问题。 (在这种情况下,如果可能的话,更新文本实际上可能没有意义,因为有时函数会有其他输出,这可能会“隐藏”更新的文本。)
如何实现不同进度条的示例在以下内容中有详细描述: http://www.r-bloggers.com/r-monitoring-the-function-progress-with-a-progress-bar/
为了完整性,从上面提到的txtProgressBar()
链接(至少与Windows + RStudio一起工作)略有更新的示例:
total <- 20
# create progress bar
pb <- txtProgressBar(min = 0, max = total, style = 3)
for(i in 1:total){
Sys.sleep(0.1)
print("Result XZY")
# update progress bar
setTxtProgressBar(pb, i)
}
close(pb)
答案 2 :(得分:0)
您可以通过每次调用CTL-L来模拟这个:
for(i in 1:10) {
cat("\014") ## I clear the screen
cat(paste0('a',i)) ## progress message in the first coin of the console.
Sys.sleep(0.5)
}