2011-05-10 12 views
12

He estado jugando con la función R txtProgressBar(). ¿Cómo puedo secuestrar la capacidad de la función para sobrescribir la salida actual en la consola?Sobrescribir la salida actual en la consola R

es decir, las actualizaciones de la barra de progreso como este:

> some R function 
============ 

se convierte en

> some R function 
======================== 
NO

> some R function 
============ 
======================== 

Por ejemplo, ¿cómo la función que mostrará la hora actual en que escribo la consola:

> some R function 
13:01 

convierte

> some R function 
13:02 

NO

> some R function 
13:01 
13:01 
13:01 
13:01 
13:02 
13:02 
13:02 
13:02 
+0

Las respuestas se discuten más en mi blog. Auto-promoción desvergonzada: http://4dpiecharts.com/2011/05/11/a-clock-utility-via-console-hackery/ –

Respuesta

12

Este programa parece funcionar:

while (1) { 
cat('\b\b\b\b\b\b',format(Sys.time(),'%H:%M')) 
flush.console() 
} 

¿Hay alguna razón esto podría ser una mala idea?

/editar: aún mejor (gracias @ Greg Nieve):

while (1) { 
cat('\r',format(Sys.time(),'%H:%M:%S')) 
flush.console() 
} 
+0

El carácter \ b de barra diagonal inversa puede causar problemas con los programas que capturan el resultado de la consola (como TextMate y SublimeText). Lo que sucede es que la salida se ve así: (0 pruebas) \ b \ b \ b \ b \ b \ b \ b \ b \ b \ b \ b \ b \ b \ b \ b \ b \ b \ b (1 prueba) \ b \ b \ b \ b \ b \ b \ b \ b \ b \ b \ b \ b \ b \ b \ b \ b \ b \ b ...(99 pruebas) \ b \ b \ b \ b \ b \ b \ b \ b \ b Ninguna solución He encontrado cajero automático, algo que debe tener en cuenta si planea liberar su trabajo para que otros lo usen – Brandon

+0

@ Brandon ¿qué hay de \ r? – Zach

+0

@Zach No sé, solo noté el problema \ b cuando se convirtió en un problema con algo que estaba usando – Brandon

1

No creo sobrescribir disponible en la consola. No hay secuencia de escape de retroceso. Se puede dibujar la barra de progreso porque la función cat no emitirá un cr a menos que así se lo indiquen.

Editar: Estaba equivocado. El carácter de retroceso se reconoce:

for (i in 1:1000) { 
    cat(as.character(Sys.time())) 
    flush.console() 
    for(i in 1:19) {cat("\8")} } 
+0

Gotcha. Entonces puedo imprimir '13: 01' y actualizarlo a' 13:01 13: 02' pero no '13: 02'? – Zach

4

Claro que puedes:

while(1) { 
    cat("\b\b\b\b\b\b\b\b",format(Sys.time(), "%H:%M:%S"),sep="") 
} 
13

En lugar de "\ b \ b \ b \ b" sólo puede utilizar "\ r" para ir al principio de la línea y sobrescribir todo en la línea (asegúrate de seguir usando cat y no incluir un avance de línea).

Aunque si desea mostrar el progreso, podría ser mejor usar winProgressBar (solo Windows) o tkProgressBar (paquete tcltk, todas las plataformas) que se puede actualizar con una etiqueta además de la barra de progreso.

En Windows también puede usar las funciones setWindowTitle o setStatusBar para poner ese tipo de información en la parte superior o inferior de la ventana más grande.

Cuestiones relacionadas