lapply
stosuje funkcję na liście, do.call
wywołuje funkcję z listą argumentów. Dla mnie wygląda to na dużą różnicę ...
Aby podać przykład z listą:
X <- list(1:3,4:6,7:9)
Z lapply otrzymujesz średnią każdego elementu na liście w ten sposób:
> lapply(X,mean)
[[1]]
[1] 2
[[2]]
[1] 5
[[3]]
[1] 8
do.call
daje błąd, ponieważ średnia oczekuje, że argument „trim” będzie równy 1.
Z drugiej strony rbind
wiąże wszystkie argumenty wierszowo. Aby połączyć X wierszami, wykonaj:
> do.call(rbind,X)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
Gdybyś użył lapply
, R miałoby zastosowanie rbind
do każdego elementu listy, co daje taki nonsens:
> 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
Aby mieć coś takiego jak Mapa, potrzebujesz ?mapply
, co jest czymś zupełnie innym. Aby uzyskać np. Średnią każdego elementu w X, ale z innym przycięciem, możesz użyć:
> mapply(mean,X,trim=c(0,0.5,0.1))
[1] 2 5 8
do.call
to prawie to samo coapply
w Lisp