lapplyapplique une fonction sur une liste, do.callappelle 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, rbindlie 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 ?mapplyquelque 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.callpresque le même queapplydans Lisp