Knitr: Chunk-Code-Ausgabe an Terminal umleiten

8

Ich möchte einige ziemlich lange parallelisierte Berechnungen überwachen, die in einer Knitr-Datei eingebettet sind.

Die Berechnungen basieren auf einem Paket, das ich geschrieben habe, und die relevante Funktion verwendet mclapply aus dem Paket multicore für die Parallelisierung. Diese Funktion gibt Fortschrittsbalken aus, um den Fortschritt der Berechnungen mithilfe einer leicht modifizierten Implementierung von txtProgressBar aus dem Paket utils zu überwachen. Der Fortschrittsbalken wird an das Terminal gedruckt und jedes Mal, wenn eine Iteration von mclapply abgeschlossen wird, über eine Fifo-Verbindung aktualisiert.

Dies funktioniert gut, wenn Sie aus einer Datei suchen oder direkt die Funktion aufrufen, aber ich finde keine Möglichkeit, dies innerhalb von knitr zu erreichen. Ich habe die relevanten Chunk-Optionen ausprobiert, ich kann Nachrichten und Warnungen an das Terminal umleiten, aber nicht den Fortschrittsbalken. Kann jemand helfen?

Entschuldigung dafür, dass ich kein minimales funktionierendes Beispiel angegeben habe, aber ich sehe nicht, wie ich dies in dieser Einstellung machen könnte.

    
Pepin_the_sleepy 15.11.2013, 19:34
quelle

2 Antworten

6

Weil txtProgressBar() in stdout schreibt und knitr alles in stdout erfasst, ist es momentan nicht einfach, den Fortschrittsbalken anzuzeigen, wenn er textbasiert ist und in stdout schreibt. Vielleicht kann ich evaluate::evaluate(debug = TRUE) intern verwenden, um zu erreichen, was Sie wollen, aber ich bin mir nicht ganz sicher, ob das gut mit der Textfortschrittsleiste funktioniert.

Meine Vorschläge im Moment sind:

  • Verwenden Sie einen GUI-basierten Fortschrittsbalken wie tcltk::tkProgressBar()
  • Schreiben Sie den Fortschritt an anderen Orten, z. (ab) mit stderr

    %Vor%
  • oder verwenden Sie Ihre Funktion außerhalb eines Code-Chunk, z. in einem Inline-Ausdruck (z. B. \Sexpr{my_multicore_function()} in Rnw oder 'r my_cool_fun()' in Rmd), da die Inline-Auswertung kein stdout

  • erfasst
Yihui Xie 16.11.2013, 21:20
quelle
1

Nachdem ich in Yihuis Antwort den Punkt über das Drucken der Fortschrittsleiste gelesen habe, würde ich vorschlagen, temporär stdout auf stderr mit sink() umzuleiten.

%Vor%     
konstunn 28.01.2017 03:33
quelle

Tags und Links