lapply
applica una funzione su un elenco, do.call
chiama una funzione con un elenco di argomenti. Questa sembra una differenza per me ...
Per fare un esempio con un elenco:
X <- list(1:3,4:6,7:9)
Con lapply ottieni la media di ogni elemento nell'elenco in questo modo:
> lapply(X,mean)
[[1]]
[1] 2
[[2]]
[1] 5
[[3]]
[1] 8
do.call
dà un errore, poiché mean si aspetta che l'argomento "trim" sia 1.
D'altra parte, rbind
lega tutti gli argomenti in ordine di riga. Quindi per associare X in ordine di riga, fai:
> do.call(rbind,X)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
Se lo utilizzassi lapply
, R si applicherebbe rbind
a tutti gli elementi dell'elenco, dandoti questa assurdità:
> 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
Per avere qualcosa come Map, è necessario ?mapply
, che è qualcosa di completamente diverso. Per ottenere ad esempio la media di ogni elemento in X, ma con un taglio diverso, puoi usare:
> mapply(mean,X,trim=c(0,0.5,0.1))
[1] 2 5 8
do.call
è quasi lo stessoapply
di Lisp