1

我喜欢在我的脚本中使用它:

cat("Saving...")
do_something_slow()
cat("\rSaved\n")

问题是应用回车而不删除行的其余部分,所以我得到了这个:

Savedg...

要修复它,我可以这样做:

cat("\rSaved\033[K\n")

但这有点难看。有没有更简单的方法?

4

2 回答 2

5

我喜欢使用message()而不是cat()生成消息。例如:

cat("Saving..."); cat("\rSaved\n")

返回:

Savdg...

尽管:

message("Saving..."); message("\rSaved\n")

返回:

Saving...
Saved

编辑:

受@gauden 回答的启发,另一个功能可能是:

replaceMessage <- function(x, width = 80)
{
    message("\r", rep(" ", times = width - length(x)), "\r", appendLF = F)
    message(x, appendLF = F)
}

接着:

replaceMessage("Saving..."); Sys.sleep(1); replaceMessage("Saved\n")

笔记:

虽然replaceMessage()在 Linux 和 Windows 上的 Rterm 中表现如预期,但在我的 Rgui(2.15.0,Windows x64)中表现很奇怪。具体来说,Saving...从不显示,在Saved显示之后,光标width向右移动空格(本例中为 80 个空格)。我不确定为什么。

于 2012-04-18T22:49:29.820 回答
4

假设您希望消息全部连续显示在一行上,那么异想天开的东西怎么样?

cleancat <- function(astring, width=80) {
    # Reserves a line of 80 (default) characters
    # and uses it for serial updates
    require("stringr")
    astring <- paste("\r", astring, sep="")
    cat(str_pad(astring, 80, "right"))
    # pretend to do something slow
    # delete this line if cleancat is used in production
    Sys.sleep(0.5) 
}

# imitate printing a series of updates
test <- lapply(c("Saving -", 
                 "Saving \\", 
                 "Saving |", 
                 "Saving /", 
                 "Saving -", 
                 "Saving \\", 
                 "Saving |", 
                 "Saving /", 
                 "Saved"), cleancat)

当然,您需要在您可能认为更丑陋的环境中加载stringr包并设置功能......cleancat

于 2012-04-18T22:59:22.563 回答