この関数mapply
は同様に機能しlapply
ますが、複数のベクトルまたはリストを指定できます。
あなたの場合、カウントアップするだけで、リストと同じ長さの2番目のベクトルを作成できます。
mapply(myfunction, mylist, seq_along(mylist))
試してみよう:
myfunction<- function(values, index){
cat("Adding values (", index, "): ", values[1], "...", values[2], " = ", sum(values), "\n" )
invisible(values[1] + values[2])
}
mylist <- list(c(5, 4), c(3, 2), c(1, 3))
mapply(myfunction, mylist, seq_along(mylist))
結果:
Adding values ( 1 ): 5 ... 4 = 9
Adding values ( 2 ): 3 ... 2 = 5
Adding values ( 3 ): 1 ... 3 = 4
上級者の楽しみ
おふざけとして、?lapply
マニュアルページを注意深く読むと、以下も機能することがわかります。
myfunction<- function(values){
print(sprintf("Adding values: %i",substitute(values)[[3]]))
return(values[1] + values[2])
}
lapply(mylist, myfunction)
これは、元の関数 (またはその他の関数) にインデックスを提供するために一般的な関数アダプターを作成し、2 番目のインデックス引数を期待するように変更できることを示唆しています。
myfunction<- function(values,index){
print(sprintf("Adding values: %i",index))
return(values[1] + values[2])
}
今度はアダプター
lapply_index_adaptor=function(f)function(x,...)f(x,substitute(x)[[3]],...)
そして今、アダプタを使ってラップリーコールを行います:
lapply(mylist, lapply_index_adaptor(myfunction))