2017-08-14 103 views
0

我想監視我的mapply函數的進度。數據由2個列表組成,並且有一個帶有2個參數的函數。進度條和mapply(輸入爲列表)

如果我用一個帶有1個參數的函數做類似的事情,我可以使用ldply而不是lapply。 (我想rbind.fill輸出到data.frame)

如果我想對mdply做同樣的事情,它不工作,因爲mdply中的函數想要從數據框的列中獲取值或陣列。 Mapply將列表作爲輸入。

這些plyr應用函數非常方便,不僅僅是因爲我可以將輸出作爲data.frame獲取,還因爲我可以使用進度條。

我知道有pbapply包,但沒有mapply版本,並且有txtProgressBar函數,但我無法弄清楚如何將這與mapply配合使用。

我試圖創建一個可重複的例子(大約需要30秒來運行)

我想壞榜樣。我的l1是一個刮掉的網站列表(rvest :: read_html),我無法將其作爲數據框發送給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簡化版,工作

mdply(l1, l2, my_func, .progress='text') 

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

回答

1

?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 

請注意我必須包裝你的函數與一個新的考慮只有一個參數,它使用該argum進入l1l2

+0

謝謝。問題是現實中的l1是我使用rvest :: read_html獲取的網頁列表。這個列表我不能用作data.frame中的列。我猜這個例子很糟糕。 – Roccer

+0

感謝您的幫助。該函數運行但輸出不是我想要的/我從mapply中得到的。以後我會接受你的答案,就像你通過例子解決了一樣。 – Roccer