2016-06-07 9 views
2

Mit einer R GUI oder nur R von einer Befehlszeile führt dieser Code dazu, dass ganze Zahlen im Abstand von 0,2 Sekunden gedruckt werden.Echtzeitdruck zur Konsole mit R im Jupiter

Im Gegensatz dazu, wenn ich R in einem jupyter Notebook verwende, geschieht der gesamte Druck erst, nachdem die Schleife abgeschlossen ist.

for(x in 1:10){ 
    print(x) 
    Sys.sleep(0.2) 
} 

Ich habe versucht, Druck in Echtzeit innerhalb von Jupyter zu zwingen, mit

for(x in 1:10){ 
    print(x) 
    flush.console() 
    Sys.sleep(0.2) 
} 

... keine Wirkung. Die Ergebnisse waren die gleichen - das Drucken innerhalb einer for-Schleife im Jupyter scheint immer erst nach der Schleife verzögert zu sein.

Gibt es eine Möglichkeit sicherzustellen, dass das Notebook die Ergebnisse von Druckanweisungen in Echtzeit ausgibt?

+0

Dies ist es wert, ein Problem auf ['IRKernel'] (https://github.com/IRkernel/IRkernel) zu posten. Es gibt Hacks dafür in Python aber nicht R. – hrbrmstr

+0

Danke für den Tipp. Ich habe ein Problem gemeldet. Danach fand ich ein [interessantes verwandtes Problem] (https://github.com/IRkernel/IRkernel/issues/295), das die Verwendung von "message()" anstelle von Drucken empfiehlt. –

Antwort

3

Derzeit ist die einzige Art und Weise zu „Trigger“ Verarbeitung von Druckausgabe wird unter Verwendung von entweder message("text") (statt print("text") oder cat("text")) oder nicht in die Schleife zu schreiben, sondern in einer Erklärung von ihnen geben.

Das zugrunde liegende Problem ist in https://github.com/IRkernel/IRkernel/issues/3 und eine vorgeschlagene Lösung ist in https://github.com/hadley/evaluate/pull/62 -> Es hat eine Änderung flush.console() und Freunde in evaluate muss, damit arbeiten. Der Kern des Problems: Wir verwenden evaluate, um den Code auszuführen und auszuwerten, die Ausgabe einer Anweisung zu einem Zeitpunkt und behandelt die Ausgabe nach die Anweisung abgeschlossen ist. Leider ist in diesem Fall eine For-Schleife nur eine Anweisung (wie alles in {...} Blöcke), so dass die gedruckte Ausgabe nur im Client erscheint, nachdem die for-Schleife beendet ist.

Eine Umgehungslösung verwendet das IRdisplay-Paket und die display_...()-Funktionen anstelle von print()/cat() (oder plots ...). Aber das benötigt die volle Kontrolle über die gedruckten Sachen: Entweder wird alles gedruckt (und es wird verzögert, bis die komplette Aussage beendet ist) oder nichts sollte in dieser Aussage drucken (oder plotten). Wenn eine aufgerufene Funktion etwas ausgibt, würde die Ausgabe in der falschen Reihenfolge sein ({print("a"); display_text("b"); print("c")} würde als b a c enden). Mit capture.output() können Sie diese Einschränkung umgehen, wenn Sie wirklich müssen ... Wenn Sie Plots verwenden, gibt es are currently no workarounds abgesehen von dem Schreiben der Handlung auf Disc und Senden über display_png(..) und Freunde.

+0

Danke. Es wäre ein "nice-to-have", um dies zu beheben, aber wahrscheinlich der häufigste Anwendungsfall ist das Hinzufügen von Debugging- oder Tracking-Anweisungen zu Code-Blöcken, die sich gerade in der Entwicklung befinden oder lange brauchen. Für diesen Zweck funktioniert 'message()' ganz gut. Die Darstellung von Plots in einer bestimmten Reihenfolge scheint viel seltener zu sein. –