Pregunta

Quiero monitorear algunos cálculos paralelos bastante largos incrustados en un archivo knitr.

Los cálculos se basan en un paquete que he escrito y la función relevante usa mclapply del multinúcleo Paquete para paralelización.Esta función genera barras de progreso para monitorear el progreso de los cálculos utilizando una implementación ligeramente modificada de txtProgressBar desde el utiles paquete.La barra de progreso se imprime en el terminal y se actualiza a través de una conexión quince cada vez que se realiza una iteración de mclapply Esta completo.

Esto funciona bien cuando se obtiene de un archivo o se llama directamente a la función, pero no encuentro manera de hacer que esto funcione dentro de knitr.Probé las opciones de fragmentos relevantes, puedo recibir mensajes y advertencias redirigidos al terminal, pero no a la barra de progreso.¿Alguien puede ayudar?

Perdón por no proporcionar un ejemplo funcional mínimo, pero no veo cómo podría crear uno en esta configuración.

¿Fue útil?

Solución

Porque txtProgressBar() escribe en la salida estándar y knitr captura todo en stdout, por lo que actualmente no es fácil mostrar la barra de progreso si está basada en texto y escribe en stdout.Tal vez pueda usar evaluate::evaluate(debug = TRUE) internamente para lograr lo que desea, pero no estoy del todo seguro si eso funciona bien con la barra de progreso del texto.

Mis sugerencias por el momento son:

  • use una barra de progreso basada en GUI como tcltk::tkProgressBar()
  • escribir el progreso en otros lugares, p.(ab)usando stderr

    ```{r progress}
    pb = txtProgressBar(min = 0, max = 100, file = stderr())
    for (i in 1:100) {
      setTxtProgressBar(pb, i)
      Sys.sleep(0.05)
    }
    close(pb)
    ```
    
  • o use su función fuera de un fragmento de código, p.en una expresión en línea (como \Sexpr{my_multicore_function()} en Rnw o `r my_cool_fun()` en Rmd), porque la evaluación en línea no captura la salida estándar

Otros consejos

Habiendo leído el punto sobre la impresión de la barra de progreso en stderr en la respuesta de Yihui, sugeriría una redirección temporal stdout a stderr con sink().

sink(stderr())

your_code()

sink()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top