【问题标题】:Progress bar within drake functions德雷克功能中的进度条
【发布时间】:2019-12-10 18:41:15
【问题描述】:

我正在尝试在函数中实现进度条,以便在 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)
      })

如果我把它放到我的 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 截获消息,以便您可以使用diagnose(your_target)$messages 检索它们。这具有将目标的所有消息延迟到完成的副作用。但是 stdout(print()cat())直接进入控制台,所以你仍然可以使用txtProgressBar()
  • 没关系,有办法解决这个问题。
  • community.rstudio.com/t/… 有解决方案。 dplyr 显然有一个进度条,您可以从中打印,drake 不会拦截。
  • 更新:如果您使用开发 drake(GitHub 版本,`remotes::install_github("ropensci/drake")),您现在应该会显示进度条。
  • @landau 我没想到会这样!我很想尝试一下。谢谢!

标签: r drake-r-package


【解决方案1】:

正如我之前提到的,drake 捕获消息以实现可重复性,因此与 progress 包存在摩擦。但正如Adam Kowalczewskihttps://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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多