lapply
applique une fonction sur une liste, do.call
appelle une fonction avec une liste d'arguments. Cela me semble une grande différence ...
Pour donner un exemple avec une liste:
X <- list(1:3,4:6,7:9)
Avec lapply, vous obtenez la moyenne de chaque élément de la liste comme ceci:
> lapply(X,mean)
[[1]]
[1] 2
[[2]]
[1] 5
[[3]]
[1] 8
do.call
donne une erreur, car la moyenne s'attend à ce que l'argument "trim" soit 1.
D'autre part, rbind
lie tous les arguments par ligne. Donc, pour lier X rowwise, vous faites:
> do.call(rbind,X)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
Si vous utilisiez lapply
, R s'appliquerait rbind
à chaque élément de la liste, vous donnant ce non-sens:
> lapply(X,rbind)
[[1]]
[,1] [,2] [,3]
[1,] 1 2 3
[[2]]
[,1] [,2] [,3]
[1,] 4 5 6
[[3]]
[,1] [,2] [,3]
[1,] 7 8 9
Pour avoir quelque chose comme Map, vous avez besoin de ?mapply
quelque chose de différent. Pour obtenir par exemple la moyenne de chaque élément de X, mais avec un ajustement différent, vous pouvez utiliser:
> mapply(mean,X,trim=c(0,0.5,0.1))
[1] 2 5 8
do.call
presque le même queapply
dans Lisp