如何在RStudio中提供整洁的R控制台更新消息?

时间:2014-04-01 00:21:37

标签: r rstudio

此代码让我在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中做得很好?

跨平台怎么样?

1 个答案:

答案 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调用的方式相同。