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.
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:
tcltk::tkProgressBar()
Schreiben Sie den Fortschritt an anderen Orten, z. (ab) mit stderr
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