2010-11-19 4 views
39

Ich frage mich, ob es einen Weg gibt, um die aktuelle Zeit in der R-Befehlszeile anzuzeigen, wie in MS DOS, können wirZeigt eine Zeituhr in der R-Befehlszeile

Prompt $T $P$G 

umfassen die Zeituhr verwenden in jeder Eingabezeile. So etwas wie

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

wird es tun, aber dann ist es an der Zeit, die eingestellt wurde behoben. Ich bin nicht sicher, wie man es automatisch aktualisieren lässt.

+0

Keine der aktuellen Callback-basierten Antworten macht dasselbe wie die MS DOS-Eingabeaufforderung, da sie von der Ausführung eines Befehls auf oberster Ebene abhängen. Wenn man einfach CR/LF in der Konsole drückt, wird die Zeit nicht aktualisiert, während dies in MS DOS aktualisiert wird. – Iterator

+0

Wo ich sitze, kann ich die Uhrzeit auf meiner Bildschirmuhr, meiner Armbanduhr, meinem alten Palm VX und meinem Telefon sehen. Brauchst du wirklich noch eine Erinnerung an deine zunehmende Sterblichkeit? :) Ist es wirklich nur für Zeitstempel Ihrer Aktivität? – Spacedman

+1

@ Spacedman Ja, das würde ich tun. Manchmal lasse ich einen Befehl von der Konsole laufen und würde gerne wissen, wann es zu Ende ist, wenn ich weggetreten bin. Die anderen Methoden machen das einigermaßen gut, aber dann muss ich noch die Uhrzeit überprüfen (oder einen neuen Befehl ausführen). Ich habe eine Menge Profiling, Logging, Messaging, etc., so dass diese prompte Sache überflüssig sein könnte, aber was solls. :) Auf jeden Fall dachte ich, es wäre am besten, die gestellte Frage zu lösen. – Iterator

Antwort

0

Ich kenne keine native R-Funktion dafür, aber ich weiß, R hat Schnittstellen mit anderen Sprachen, die Systemzeitbefehle haben. Vielleicht ist das eine Option?

Thierry erwähnt system.time() und es gibt auch proc.time() je nachdem, was Sie für es brauchen, obwohl keiner von ihnen geben Sie die aktuelle Zeit.

3

Sie können das Standardzeichen ändern, das über den Befehl options() angezeigt wird.

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

Schauen Sie sich die Hilfeseite für ?options für eine vollständige Liste der Dinge, die Sie festlegen können: Sie können so etwas versuchen. Es ist eine sehr nützliche Sache, darüber zu wissen!

Angenommen, dies ist etwas, was Sie für jede R-Sitzung tun möchten, ziehen Sie in Betracht, das zu Ihrem .Rprofile zu verschieben. Mehrere andere gute Nuggets der Programmierung Glück können hither zu diesem Thema gefunden werden.

+2

Eigentlich nicht ganz. Sie erhalten den Zeitausdruck * constant *, wenn 'options (" prompt "= ...)' gesetzt wurde. Sie benötigen einen Rückruf, wie in meiner Antwort gezeigt. –

+2

Es ist die Lösung, die OP gab und nicht mochte. Aber der Verweis auf die Rprofile ist nützlich. –

45

Chase zeigt den richtigen Weg, da options("prompt"=...) dafür verwendet werden kann. Aber seine Lösungen fügt einen konstanten Zeitausdruck hinzu, der nicht das ist, was wir wollen.

Die Dokumentation für die Funktion taskCallbackManager hat den Rest:

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> 

Wir registrieren einen Rückruf, der nach jedem Befehl ausgeführt ausgewertet wird. Das macht den Trick. Weitere interessante Dokumentation ist in this document von der R-Entwickler-Website.

+0

Hoppla, nur die URL zu Duncan TL's write-up korrigiert. –

+0

@Dirk: Wunderbar, thx für den Zeiger auf diese Funktion. Diese Lösung enthält jedoch immer noch einen "minor" -Fehler: Wenn Sie einen Fehler haben, wird die Zeit nicht aktualisiert. Probieren Sie f <- function() {Sys.sleep (1); stop()} - und dann - f(). Nicht, dass ich das gewusst hätte ... –

+0

Danke Dirk und Joris! @Joris: Könntest du ein bisschen weiter machen, um die Zeit zu aktualisieren, wenn ein Fehler auftritt. Ich habe versucht, Funktion() {Sys.sleep (1); stop()}, aber es schien nicht zu funktionieren. – Shu

17

Hier ist eine alternative Rückruf Lösung:

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

Dies funktioniert genauso wie Dirks Methode, aber die Syntax ist ein bisschen zu mir einfacher.

+1

Leider ist keiner genau wie der DOS-Prompt, der auch dann aktualisiert würde, wenn die Eingabetaste gedrückt wird. Die Callbacks warten nur auf eine Ausführung auf oberster Ebene. Um zu erfahren, wie man es über einen Clock-Trigger macht, habe ich eine Lösung mit dem 'tcltk2'-Paket erstellt. – Iterator

14

Keine der anderen Methoden, die auf Rückrufen basieren, aktualisiert die Eingabeaufforderung , es sei denn ein Befehl der obersten Ebene ausgeführt wird. Wenn Sie in der Konsole die Eingabetaste drücken, wird keine Änderung vorgenommen. Dies ist die Art der Standard-Rückrufbehandlung von R.

Wenn Sie das tcltk2-Paket zu installieren, können Sie einen Taskplaner einrichten, der die option() ändert sich wie folgt:

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

Voila, so etwas wie die MS DOS-Eingabeaufforderung.

NB: Inspiration kam von this answer.

Hinweis 1: Die Wartezeit (1000 in diesem Fall) bezieht sich auf die Anzahl der Millisekunden, nicht Sekunden. Sie können es nach unten anpassen, wenn die Auflösung in der Sekunde sinnvoll ist.