在R中显示状态信息

32

我想编写一个函数,向用户显示状态消息,例如时间、完成百分比和进程的当前状态。我可以处理消息的组装,但我不想只是在控制台上打印并让它们一个接一个地滚动。我真的希望消息像message()一样在不滚动的情况下更改,而且不需要任何图形。这在R中是否可行?


12
这是R。没有如果。只有如何。--Simon Blomberg - Joshua Ulrich
4个回答

27

你觉得这样怎么样?

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()
}

6
不要使用 cat(),改用 message()(可以被禁止), 正如今天一篇R博客文章所讨论的那样,指出了与 cat() 相关的不满之处。 - Dirk Eddelbuettel
2
@Dirk:必须使用 message(..., appendLF = FALSE),否则滚动消息将出现在控制台上,而这正是 OP 特别想避免的。 - Sharpie
@Dirk 将 cat() 替换为 message() 每次更新时都会添加一个新行。你需要做一些额外的工作来防止换行吗?顺便说一下,txtProgressBar 使用 cat() - Joshua Ulrich
2
哼。谢谢大家。看来在这种情况下不行,但作为一般特性,能够通过littler或Rscript抑制行噪声是可爱的。 - Dirk Eddelbuettel
@Dirk:抱歉,在我阅读完文档后,我不得不更新我的评论。如果提供了适当的参数,可以完全用message()替换cat() - Sharpie
1
很高兴有人读了这篇文章。不要介意我自己做些宣传:http://4dpiecharts.com/2011/01/20/bad-kitty/ - Richie Cotton

19

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

查看在调用 txtProgressBar 时创建的 up1up2up3 函数的示例,以了解如何处理更新而不滚动控制台。


2
太棒了!你还可以通过以下方式创建和设置自己的更新函数: tpb <- txtProgressBar (...);myUpFun <- function(value) {...};tpb $ up <- myUpFun。然后,您可以使用 message() 编写更新函数,这样 Dirk 就可以抑制噪音。;-) - Joshua Ulrich
@Joshua:观察得很好!当我在考虑创建自定义更新函数时,我设想了必须复制和重写txtProgressBar()以实现它。 - Sharpie
还有plyr::progress_text。它只是txtProgressBar的简单包装器... - aL3xa

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)

alt text


1
这个功能很酷,可以提高完整性,但我目前需要的是仅限文本的解决方案。 - JD Long
2
当tcltk弹出时,我没有完全阅读你的问题。这是一个冲动回答,我为此道歉。也许将来的你会需要它。 - Roman Luštrik
+1 太棒了。这甚至激励我学习一些关于TclTk的知识。 - Iterator

8
也许有更优雅的方法来实现这个,但是以下方法可以解决问题:
test.message <- function() {
  for (i in 1:9){
    cat(i)
    Sys.sleep(1)
    cat("\b")
  }

}

如果您正在自动生成消息,则需要计算要输出多少\b字符才能恢复正确的数量,但这非常简单。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接