wyświetlanie komunikatu o stanie w R

Chciałbym napisać funkcję, która przedstawia użytkownikowi komunikat o stanie, który pokazuje coś takiego jak czas, procent kompletny i aktualny stan procesu. Mogę poradzić sobie z montażem wiadomości, ale chciałbym zrobić coś innego niż tylko wydrukować na konsoli i mieć to przewijanie w górę, jedna wiadomość po drugiej. Bardzo chciałbym, żeby wiadomość zmieniała się bez przewijania jak message() i bez żadnej grafiki. Czy to możliwe z R?

Author: Joris Meys, 2011-01-21

4 answers

Może coś takiego?

for(i in 1:10) {
  Sys.sleep(0.2)
  # Dirk says using cat() like this is naughty ;-)
  #cat(i,"\r")
  # So you can use message() like this, thanks to Sharpie's
  # comment to use appendLF=FALSE.
  message(i,"\r",appendLF=FALSE)
  flush.console()
}
 24
Author: Joshua Ulrich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-21 03:58:47

Pakiet utils zawiera txtProgressBar i funkcje do jego aktualizacji, które mogą być użyte do pokazania procent kompletności procesu.

Zobacz up1, up2 i up3 funkcje, które są tworzone podczas wywołania do txtProgressBar dla przykładu, jak aktualizacje są obsługiwane bez przewijania konsoli.

 17
Author: Sharpie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-21 03:30:36

Oto kilka błyskotliwych błyskotek. Od ?tcltk::tkProgressBar.

pb <- tkProgressBar("test progress bar", "Some information in %",
        0, 100, 50)
Sys.sleep(0.5)
u <- c(0, sort(runif(20, 0 ,100)), 100)
for(i in u) {
    Sys.sleep(0.1)
    info <- sprintf("%d%% done", round(i))
    setTkProgressBar(pb, i, sprintf("test (%s)", info), info)
}
Sys.sleep(5)
close(pb)

alt text

 15
Author: Roman Luštrik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-21 08:16:10

Mogą być bardziej eleganckie sposoby, aby to zrobić, ale to może to zrobić:

test.message <- function() {
  for (i in 1:9){
    cat(i)
    Sys.sleep(1)
    cat("\b")
  }

}

Jeśli automatycznie generujesz wiadomość, musisz obliczyć, ile znaków \b ma zostać wysłanych, aby utworzyć kopię zapasową odpowiedniej ilości, ale jest to dość proste.

 7
Author: Tyler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-21 03:29:54