此代码让我在R控制台中留下一条好消息(在Windows上),而不会填满屏幕:
imax <- 2000
for (i in seq_len(imax)) {
mess <- sprintf("slightly different length message: %i", i)
message(paste(rep("\b", nchar(mess)), collapse = ""), appendLF = FALSE)
message(mess, appendLF = i == imax)
flush.console()
}
在RStudio中,退格符不起作用,我到处都收到可怕的附加信息。
我怎样才能在Rgui和RStudio中做得很好?
跨平台怎么样?
答案 0 :(得分:4)
您是否需要实际值/消息,或者您只是想显示进度?
如果是后者,txtProgressBar()
可能就足够了:
imax <- 2000
msg <- txtProgressBar(min=1, max=length(seq_len(imax)), initial=1)
for (i in seq_len(imax)) {
setTxtProgressBar(msg, i)
Sys.sleep(0.001) # so it will show something vs just fly through the loop
}
close(msg)
如果您需要值/消息,并且只是没有实际诊断消息就可以,那么cat
应该这样做:
imax <- 2000
for (i in seq_len(imax)) {
mess <- sprintf("slightly different length message: %i", i)
cat(paste(rep("\b", nchar(mess)), collapse = ""))
cat(mess)
if (i == imax) { cat("\n") }
Sys.sleep(0.001) # again, loop is too fast to show w/o a delay
}
原始提交中的编辑/添加:
进行了一些额外的测试,并且输出到stderr
导致了RStudio控制台区域中的不同行为。当我直接致电.makeMessage
然后使用cat
输出到stdout
vs stderr
时,它可以正常工作:
imax <- 2000
for (i in seq_len(imax)) {
mess <- sprintf("slightly different length message: %i", i)
cat(.makeMessage(paste(rep("\b", nchar(mess)), collapse = ""), domain=NA, appendLF = FALSE))
cat(.makeMessage(mess, domain=NA, appendLF = (i == imax)))
Sys.sleep(0.001) # delay...see above snippets
flush.console()
}
将file=stderr()
添加到cat
,它的行为与原始message
调用的方式相同。