私は自分のスクリプトでこれを使用するのが好きです:
cat("Saving...")
do_something_slow()
cat("\rSaved\n")
問題は、残りの行を消去せずにキャリッジリターンが適用されることです。そのため、次のようになります。
Savedg...
それを修正するために私はすることができます:
cat("\rSaved\033[K\n")
でもそれはちょっと醜いです。もっと簡単な方法はありますか?
私は自分のスクリプトでこれを使用するのが好きです:
cat("Saving...")
do_something_slow()
cat("\rSaved\n")
問題は、残りの行を消去せずにキャリッジリターンが適用されることです。そのため、次のようになります。
Savedg...
それを修正するために私はすることができます:
cat("\rSaved\033[K\n")
でもそれはちょっと醜いです。もっと簡単な方法はありますか?
メッセージを生成する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スペース)右に移動します。理由はわかりません。
すべてのメッセージを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
ますが、これはさらに醜いと思うかもしれません...