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")

ノート:

LinuxおよびWindows上のRtermreplaceMessage()で期待どおりに動作しますが、私のRgui(2.15.0、Windows x64)では奇妙な動作をします。具体的にSaving...は、が表示されることはなく、表示された後Saved、カーソルがwidthスペース(例では80スペース)右に移動します。理由はわかりません。

于 2012-04-18T22:49:29.820 に答える
4

すべてのメッセージを1行に連続して表示したい場合、気まぐれなことはどうでしょうか。

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 に答える