2017-08-14 10 views
0

私のマッパ機能の進捗状況を監視したいと思います。データは2つのリストで構成され、2つの引数を持つ関数があります。プログレスバーとマップリー(リストとして入力)

私は1つの引数を取る関数と同様のことをすれば、lapplyの代わりにldplyを使うことができます。 (私はrbind.fillをdata.frameに出力したい)

mdplyで同じことをしたいのであれば、mdplyの関数がデータフレームの列から取得した値を必要とするため、アレイ。 Mapplyはリストを入力として受け取ります。

これらのplyr apply関数は、出力をdata.frameとして取得できるだけでなく、プログレスバーを使用できるため便利です。

私はpbapplyパッケージがあることを知っていますが、mapplyバージョンはなく、txtProgressBar関数がありますが、これをmapplyでどのように使うのか分かりませんでした。

私は悪い例を推測

(実行するために約30秒かかります)再現性の例を作成しようとしました。私のl1はmdplyにデータフレームとして送ることができない掻かれたウェブサイト(rvest :: read_html)のリストです。リストは本当にリストである必要があります。

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 does't作業

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から私はあなたが2つのデータ入力を指定することはできませんあえて言います。あなたのエラーメッセージは、私は私があなたの目的を理解したと思う

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が関数としてl2を使用しようとしているが、リストが関数に強制することはできません...

意味します今:

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を使用していますのでご注意ください出入り口l1およびl2

+0

ありがとうございます。問題は実際には私がrvest :: read_htmlを使って掻いたWebページのリストです。このリストはdata.frameの列として使用できません。私はその例が悪いと思う。 – Roccer

+0

ご協力ありがとうございます。関数は実行されますが、出力は私が望むものではなく、私がmapplyから得るものでもありません。私は後であなたの答えを例文で解決するように受け入れます。 – Roccer

関連する問題