代码之家  ›  专栏  ›  技术社区  ›  Roccer

进度条和mapply(作为列表输入)

  •  1
  • Roccer  · 技术社区  · 7 年前

    我想监控mapply函数的进度。数据由2个列表组成,有一个具有2个参数的函数。

    我知道有pbapply包,但没有mapply版本,也有txtProgressBar函数,但我不知道如何将其用于mapply。

    我试图创建一个可复制的示例(运行大约需要30秒)

    mdply <- plyr::mdply
    
    l1 <- as.list(rep("a", 2*10^6+1))
    l2 <- as.list(rnorm(-10^6:10^6))
    
    my_func <- function(x, y) {
    
    ab <- paste(x, "b", sep = "_")
    ab2 <- paste0(ab, exp(y), sep = "__")
    
    return(ab2)
    
    }
    
    mapply(my_func, x = l1, y = l2)
    

    mdply不工作

    mdply(l1, l2, my_func, .progress='text')
    
    Error in do.call(flat, c(args, list(...))) : 'what' must be a function or character string
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Bruno Zamengo    7 年前

    ?mdply 我敢说你不能指定两个数据输入。您的错误消息意味着 mdply 正在尝试使用 l2

    以下操作很好

    mdply(
        data.frame(x=unlist(l1), y=unlist(l2)), # create a data.frame from l1 and l2
        my_func, # your function
        .progress=plyr::progress_text(style = 3) # create a textual progress bar
    )[, 3] # keep the output only
    

    我想我现在明白你的目的了:

    mdply(
        .data=data.frame(r=1:length(l1)), # "fake data" (I will use them as item index)
        .fun=function(r) return(my_func(l1[[r]], l2[[r]])), # a wrapper function of your function
        .progress=plyr::progress_text(style = 3) # create a textual progress bar
    )[, 2] # keep the output only
    

    请注意,我必须用一个新的函数包装您的函数,该函数只考虑一个参数,并且它使用该参数访问 l1 l2

        2
  •  0
  •   Roccer    5 年前

    回答我自己的问题。 现在有一个包可以做到这一点。它被称为 pbapply