2011-01-21 9 views
28

Mi piacerebbe scrivere una funzione che presenta all'utente un messaggio di stato che mostra qualcosa come il tempo, la percentuale di completamento e lo stato corrente di un processo. Posso gestire il montaggio del messaggio, ma mi piacerebbe fare qualcosa di diverso dalla semplice stampa sulla console e farlo scorrere verso l'alto, un messaggio dopo l'altro. Mi piacerebbe davvero che il messaggio cambiasse senza scorrere come message() e senza alcuna grafica. È possibile con R?mostrando un messaggio di stato in R

+10

"Si tratta di R. Non v'è alcun caso. Solo come". --Simon Blomberg –

risposta

24

Che ne dici di qualcosa del genere?

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

Non usare 'cat()', usa 'message()' (che può essere soppresso) come ad esempio discusso su un post dei blogger R oggi discutendo i grip con 'cat()'. –

+1

@Dirk: Dovrebbe essere 'message (..., appendLF = FALSE)' --- altrimenti i messaggi a scorrimento appariranno sulla console che l'OP desiderava specificamente evitare. – Sharpie

+0

@Dirk sostituendo 'cat()' con 'message()' aggiunge una nuova riga ad ogni aggiornamento. Devi fare qualcosa in più per evitare la newline? FWIW, 'txtProgressBar' usa' cat() '. –

7

Ci possono essere più eleganti modi per farlo, ma questo potrebbe farlo:

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

} 

Se si sta generando automaticamente il vostro messaggio, avrete bisogno di calcolare quanti \ caratteri b in uscita per eseguire il backup della quantità corretta, ma è abbastanza semplice.

17

Il pacchetto utils contiene txtProgressBar e le funzioni per l'aggiornamento che può essere utilizzato per mostrare la percentuale di completamento di un processo.

Vedi le up1, up2 e up3 funzioni che si creano durante una chiamata a txtProgressBar per esempi di come vengono gestiti gli aggiornamenti senza dover scorrere la console.

+2

È fantastico! Puoi anche creare e impostare la tua funzione di aggiornamento tramite: 'tpb <- txtProgressBar (...); myUpFun <- function (value) {...}; tpb $ up <- myUpFun'. Quindi puoi scrivere una funzione di aggiornamento usando 'message()' così Dirk può sopprimere il rumore. ;-) –

+0

@Joshua: buona osservazione! Quando pensavo di creare una funzione di aggiornamento personalizzata, prevedevo di dover copiare e riscrivere 'txtProgressBar()' per implementarlo. – Sharpie

+0

C'è anche 'plyr :: progress_text'. È un semplice wrapper per 'txtProgressBar', anche se ... – aL3xa

15

Ecco alcuni bling bling. Da ?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

+1

è davvero bello avere per completezza, ma il mio attuale bisogno è una soluzione solo testo. –

+2

Non ho letto la tua domanda fino alla fine quando tcltk è comparso. È stata una risposta d'impulso, per la quale mi scuso. Forse tu dal futuro ne avrai bisogno un giorno. –

+0

+1 Fantastico. Mi ispira anche a imparare un po 'di TclTk. – Iterator

Problemi correlati