我想编写一个函数,向用户显示状态消息,例如时间、完成百分比和进程的当前状态。我可以处理消息的组装,但我不想只是在控制台上打印并让它们一个接一个地滚动。我真的希望消息像message()
一样在不滚动的情况下更改,而且不需要任何图形。这在R中是否可行?
你觉得这样怎么样?
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()
}
cat()
,改用 message()
(可以被禁止), 正如今天一篇R博客文章所讨论的那样,指出了与 cat()
相关的不满之处。 - Dirk Eddelbuettelmessage(..., appendLF = FALSE)
,否则滚动消息将出现在控制台上,而这正是 OP 特别想避免的。 - Sharpiecat()
替换为 message()
每次更新时都会添加一个新行。你需要做一些额外的工作来防止换行吗?顺便说一下,txtProgressBar
使用 cat()
。 - Joshua Ulrichmessage()
替换cat()
。 - Sharpie utils
包含了 txtProgressBar
和用于更新它的函数,可用于显示进程的完成百分比。
查看在调用 txtProgressBar
时创建的 up1
、up2
和 up3
函数的示例,以了解如何处理更新而不滚动控制台。
tpb <- txtProgressBar (...);myUpFun <- function(value) {...};tpb $ up <- myUpFun
。然后,您可以使用 message()
编写更新函数,这样 Dirk 就可以抑制噪音。;-) - Joshua UlrichtxtProgressBar()
以实现它。 - Sharpieplyr::progress_text
。它只是txtProgressBar
的简单包装器... - aL3xa这里是一些闪闪发光的东西,来自?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)
test.message <- function() {
for (i in 1:9){
cat(i)
Sys.sleep(1)
cat("\b")
}
}
如果您正在自动生成消息,则需要计算要输出多少\b字符才能恢复正确的数量,但这非常简单。