在R中显示状态消息

JD *_*ong 30 message r status statusbar

我想编写一个向用户显示状态消息的函数,该消息显示时间,完成百分比和进程的当前状态.我可以处理组合消息,但我想做的事情不仅仅是打印到控制台并让它向上滚动,一个消息接着另一个.我真的很喜欢在不滚动message()和没有任何图形的情况下更改消息.这可能与R?

Jos*_*ich 26

这样的事怎么样?

for(i in 1:10) {
  Sys.sleep(0.2)
  # Dirk says using cat() like this is naughty ;-)
  #cat(i,"\r")
  # So you can use message() like this, thanks to Sharpie's
  # comment to use appendLF=FALSE.
  message(i,"\r",appendLF=FALSE)
  flush.console()
}
Run Code Online (Sandbox Code Playgroud)

  • 不要使用`cat()`,使用`message()`(可以被抑制),例如在今天的R-bloggers帖子中讨论过与`cat()`的抱怨. (6认同)
  • @Dirk:必须是“ message(...,appendLF = FALSE)”-否则,滚动消息将出现在控制台上,OP尤其希望避免这种情况。 (2认同)
  • 哼.多谢你们.在这种情况下不要猜测*但作为一般功能,能够抑制线路噪声是很可爱的,例如在脚本中通过littler或Rscript. (2认同)

Sha*_*pie 17

utils软件包包含txtProgressBar用于更新它的函数和函数,可用于显示进程的完成百分比.

up1,up2up3那些对通话过程中创建的功能txtProgressBar为更新的方式无需滚动控制台处理的例子.

  • 这太妙了!您还可以通过以下方式创建和设置自己的更新功能:`tpb < - txtProgressBar(...); myUpFun < - function(value){...}; tpb $ up < - myUpFun`.然后你可以使用`message()`来编写更新函数,这样Dirk可以抑制噪声.;-) (2认同)

Rom*_*rik 15

这是一些金光闪闪的金光闪闪.来自?tcltk::tkProgressBar.

pb <- tkProgressBar("test progress bar", "Some information in %",
        0, 100, 50)
Sys.sleep(0.5)
u <- c(0, sort(runif(20, 0 ,100)), 100)
for(i in u) {
    Sys.sleep(0.1)
    info <- sprintf("%d%% done", round(i))
    setTkProgressBar(pb, i, sprintf("test (%s)", info), info)
}
Sys.sleep(5)
close(pb)
Run Code Online (Sandbox Code Playgroud)

替代文字

  • 当tcltk弹出时,我没有把你的问题读到最后.这是一个冲动的答案,我为此道歉.也许你将来有一天会需要它. (2认同)

Tyl*_*ler 7

可能有更优雅的方法来做到这一点,但这可以做到:

test.message <- function() {
  for (i in 1:9){
    cat(i)
    Sys.sleep(1)
    cat("\b")
  }

}
Run Code Online (Sandbox Code Playgroud)

如果您自动生成消息,则需要计算要输出的\ b个字符数以备份正确的数量,但这非常简单.