R语言 进度条和Map(列表输入)

dojqjjoe  于 2023-01-06  发布在  其他
关注(0)|答案(2)|浏览(153)

我想监控我的mapply函数的进度。数据由2个列表组成,有一个函数有2个参数。
如果我用一个参数为1的函数做类似的事情,我可以用ldply代替lapply。(我想用rbind.fill把输出转换成一个data.frame)
如果我想对mdply做同样的事情,它不能工作,因为mdply中的函数需要从数据框或数组的列中获取值,Mapply需要列表作为输入。
这些plyr apply函数非常方便,不仅因为我可以以data.frame的形式获得输出,还因为我可以使用进度条。
我知道有pbapply包,但是没有mapply版本,有txtProgressBar函数,但是我不知道如何在mapply中使用这个函数。
我尝试创建一个可重复的示例(运行大约需要30秒)
我猜这个例子很糟糕。我的l1是一个抓取的网站列表(rvest::read_html),我不能将其作为 Dataframe 发送到mdply。列表确实需要是列表。

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(l1, l2, my_func, .progress='text')

Error in do.call(flat, c(args, list(...))) : 'what' must be a function or character string
r1wp621o

r1wp621o1#

?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

请注意,我必须用一个新函数 Package 您的函数,该函数只考虑一个参数,并且使用该参数访问l1l2

e4yzc0pl

e4yzc0pl2#

回答我自己的问题。现在在pbapply中有一个名为pbmapply的函数,可以在mapply中添加进度条。

相关问题