drake 函数中的进度条

Progress bar within drake functions

我正在尝试在函数内实现进度条以用于 drake-r 项目。我正在使用 progress_bar R6 class 的进度包。以下示例生成预期的进度条:

library(dplyr)
library(purrr)
library(progress)

data <- mtcars %>%
    split(.$carb)

n <- length(data)

pb <- progress::progress_bar$new(total = n)

data <- data %>%
    map(~{pb$tick()
      Sys.sleep(2)
      lm(mpg ~ wt, data = .x)
      })

如果我将它放入我的 drake 工作流中,每次迭代都会显示一个新的进度条:

fit_lm <- function() {
  data <- mtcars %>%
    split(.$carb)

  n <- length(data)

  pb <- progress::progress_bar$new(total = n)

  data <- data %>%
    map(~{pb$tick()
      Sys.sleep(2)
      lm(mpg ~ wt, data = .x)
      })

  return(data)
}

plan <- drake_plan(
  models = fit_lm()
)

make(plan)

控制台输出:

如何修改函数以仅显示一个在每次迭代时更新的进度条?

正如我之前提到的,drake 捕获消息以实现可重复性,因此与 progress 包存在摩擦。但是由于 Adam Kowalczewski pointed out at https://community.rstudio.com/t/including-a-progress-bar-in-a-drake-plan-step/42516dplyr 有自己的进度条,您可以使用 pb$tick()$print() 将其打印到标准输出。这对我有用:

library(drake)
library(dplyr)
library(purrr)

fit_lm <- function() {
  data <- mtcars %>%
    split(.$carb)
  n <- length(data)
  pb <- progress_estimated(n = n)
  data <- data %>%
    map(~{
      pb$tick()$print()
      Sys.sleep(2)
      lm(mpg ~ wt, data = .x)
    })
  return(data)
}

plan <- drake_plan(
  models = fit_lm()
)

make(plan)