0

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

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)
      })

如果我把它放到我的德雷克工作流程中,每次迭代都会显示一个新的进度条:

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)

控制台输出: 在此处输入图像描述

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

4

1 回答 1

1

正如我之前提到的,捕获消息以实现可重复性,因此与包drake存在摩擦。progress但正如Adam Kowalczewski在https://community.rstudio.com/t/including-a-progress-bar-in-a-drake-plan-step/42516指出的那样,dplyr它有自己的进度条,您可以使用 .将其打印到标准输出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)
于 2019-12-11T01:46:15.217 回答