2010-11-19 17 views
39

Me pregunto si hay una manera de mostrar la hora actual en la línea de comandos R, al igual que en MS-DOS, podemos utilizarmuestra un reloj de tiempo en la línea de comandos R

Prompt $T $P$G 

para incluir el reloj de tiempo en cada línea de aviso. Algo así como

options(prompt=paste(format(Sys.time(), "%H:%M:%S"),"> ")) 

lo hará, pero luego se fija en el momento en que se creó. No estoy seguro de cómo hacer que se actualice automáticamente.

+0

Ninguna de las respuestas actuales de devolución de llamada hace lo mismo que el símbolo del sistema MS DOS, ya que dependen de la ejecución de un comando de nivel superior. Si uno simplemente presiona CR/LF en la consola, no actualizará la hora, mientras que esto se actualizará en MS DOS. – Iterator

+0

Donde estoy sentado puedo ver la hora en mi reloj de pantalla, mi reloj de pulsera, mi antiguo y confiable Palm VX y mi teléfono. ¿De verdad necesitas otro recordatorio de tu creciente mortalidad? :) ¿Es realmente solo para marcar tu actividad? – Spacedman

+1

@Spacedman Sí, eso es lo que haría. A veces ejecuto un comando desde la consola, y me gustaría saber cuándo terminó, si me alejé. Los otros métodos lo hacen razonablemente bien, pero aún tengo que verificar la hora del reloj (o ejecutar un nuevo comando). Tengo una gran cantidad de perfiles, registros, mensajes, etc., así que esto pronto podría ser superfluo, pero qué diablos. :) En cualquier caso, pensé que era mejor resolver la pregunta que se hizo. – Iterator

Respuesta

0

No conozco una función R nativa para hacer esto, pero sé que R tiene interfaces con otros lenguajes que sí tienen comandos de tiempo del sistema. Tal vez esta es una opción?

Thierry mencionó system.time() y también está proc.time() dependiendo de lo que lo necesite, aunque ninguno de estos le da la hora actual.

3

Puede cambiar el carácter predeterminado que se muestra a través del comando options(). Es posible que desee probar algo como esto:

options(prompt = paste(Sys.time(), ">")) 

Mira la página de ayuda para ?options para obtener una lista completa de las cosas que se pueden establecer. ¡Es algo muy útil de saber!

Suponiendo que esto es algo que desea hacer para cada sesión R, considere moverlo a su .Rprofile. Se pueden encontrar otros buenos nuggets de felicidad de programación en hither sobre ese tema.

+2

En realidad, no del todo. Obtiene la expresión * constant * time de cuando 'options (" prompt "= ...)' se configuró. Necesitas una devolución de llamada como se muestra en mi respuesta. –

+2

Es la solución que OP dio y no le gustó. Pero la referencia al Rprofile es útil. –

45

Chase apunta de la manera correcta como options("prompt"=...) se puede utilizar para esto. Pero sus soluciones agregan una expresión de tiempo constante que no es lo que queremos.

La documentación de la función taskCallbackManager tiene el resto:

R> h <- taskCallbackManager() 
R> h$add(function(expr, value, ok, visible) { 
+  options("prompt"=format(Sys.time(), "%H:%M:%S> ")); 
+    return(TRUE) }, 
+  name = "simpleHandler") 
[1] "simpleHandler" 
07:25:42> a <- 2 
07:25:48> 

Registramos una devolución de llamada que consigue evalúa después de cada orden se completa. Eso hace el truco. La documentación más sofisticada es in this document del sitio del desarrollador de R.

+0

Ooops, acabo de arreglar la URL del artículo de Duncan TL. –

+0

@Dirk: Maravilloso, thx para el puntero a esa función. Sin embargo, esta solución todavía tiene un error menor: cuando tienes un error, no actualiza la hora. Pruebe f <- function() {Sys.sleep (1); stop()} - y luego - f(). No es que hubiera sabido cómo hacerlo ... –

+0

¡Gracias, Dirk y Joris! @Joris: ¿podría explicar un poco más sobre la actualización del tiempo cuando hay un error? Intenté la función() {Sys.sleep (1); stop()}, pero no pareció funcionar. – Shu

17

Aquí es una solución alternativa de devolución de llamada:

updatePrompt <- function(...) {options(prompt=paste(Sys.time(),"> ")); return(TRUE)} 
addTaskCallback(updatePrompt) 

Esto funciona igual que el método de Dirk, pero la sintaxis es un poco más simple para mí.

+1

Desafortunadamente, ninguno de los dos es precisamente como el mensaje de DOS, que se actualizará incluso cuando se presiona la tecla de retorno. Las devoluciones de llamada solo esperan una ejecución de nivel superior. Para aprender a hacerlo a través de un disparador de reloj, creé una solución con el paquete 'tcltk2'. – Iterator

14

Ninguno de los otros métodos, que se basan en devoluciones de llamada, actualizará la solicitud a menos que se ejecute un comando de nivel superior. Por lo tanto, presionar regresar en la consola no creará un cambio. Tal es la naturaleza del manejo de devolución de llamada estándar de R.

Si instala el paquete tcltk2, puede configurar un programador de tareas que cambia el option() de la siguiente manera:

library(tcltk2) 
tclTaskSchedule(1000, {options(prompt=paste(Sys.time(),"> "))}, id = "ticktock", redo = TRUE) 

Voila, algo así como el indicador de MS DOS.

NB: La inspiración vino de this answer.


Nota 1: El tiempo de espera (1000 en este caso) se refiere a la # de milisegundos, no segundos. Puede ajustarlo hacia abajo cuando la resolución de segundos es útil.

Cuestiones relacionadas