Pregunta

This code lets me leave a nice message (on Windows) in the R console, without fill up the screen:

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()
}

In RStudio the backspace character doesn't work and I get horrible appended messages everywhere.

How can I do this nicely in both Rgui and RStudio?

What about cross-platform?

¿Fue útil?

Solución

Do you require the actual values/message or are you just trying to show progress?

If it's the latter, txtProgressBar() might be enough:

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)

If you need the values/message and are OK with just not having it be an actual diagnostic message, then cat should do it:

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
}

EDIT/addition from original submission:

Did some additional testing and it's the output to stderr that's causing the different behavior in RStudio's console area. When I call .makeMessage directly and then use cat with output going to stdout vs stderr it works:

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()
}

add file=stderr() to the cat's and it will behave the way the original message call does.

Otros consejos

You can use cat using \r, that is

cat("\r", "slightly different length message:", i)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top