在 R 中计算分组 data.frame 期间是否有一种优雅的方式来显示进度条?

Is there an elegant way to show a progress bar during the computation of a grouped data.frame in R?

我正在将复杂函数应用于分组 data.frame。为简单起见,此处将此函数视为 colSums 函数。假设我们有以下 data.frame:

df <- data.frame(A=runif(600000,0,1),
                 B=rep(c("group1", "group2","group3","group4","group5","group6"), 100000))

我还想执行一个 dplyr 链:

df <- df %>%
    group_by(.data$B) %>%
    summarize(colSums(across()))

在此计算过程中,我想要一个显示剩余时间的进度条。 例如:

[=========================>] 100%

我知道 dplyr 中有解决方案,但据我所知它们已被取代。因此,我想使用 Progress 包。此进度条基于 for 循环期间的滴答更新。我想知道这个 dplyr 链是否可行。到目前为止,我想不出解决办法。有什么想法吗?

这是一个使用进度包的解决方案。你必须初始化进度条并告诉它 groups/ticks 的数量。然后在您的自定义计算中,增加栏。

library(tidyverse)
library(progress)

df <- data.frame(A=runif(600000,0,1),
                 B=rep(c("group1", "group2","group3","group4","group5","group6"), 100000)) %>% 
    group_by(B)

my_slow_function <- function(col){
    pb$tick()
    Sys.sleep(0.5)
    sum(col)
}

num_ticks <- n_groups(df)
pb <- progress_bar$new(format = "[:bar] :current/:total (:percent) elapsed :elapsed eta :eta",
                       total = num_ticks)


df %>% 
    summarize(output = my_slow_function(A))