lapply
Wendet eine Funktion auf eine Liste an und do.call
ruft eine Funktion mit einer Liste von Argumenten auf. Das sieht für mich nach einem ziemlichen Unterschied aus ...
Um ein Beispiel mit einer Liste zu geben:
X <- list(1:3,4:6,7:9)
Mit lapply erhalten Sie den Mittelwert jedes Elements in der Liste wie folgt:
> lapply(X,mean)
[[1]]
[1] 2
[[2]]
[1] 5
[[3]]
[1] 8
do.call
gibt einen Fehler aus, da der Mittelwert erwartet, dass das Argument "trim" 1 ist.
rbind
Bindet andererseits alle Argumente zeilenweise. Um X zeilenweise zu binden, gehen Sie wie folgt vor:
> do.call(rbind,X)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
Wenn Sie verwenden würden lapply
, würde R für rbind
jedes Element der Liste gelten, was Ihnen diesen Unsinn gibt:
> 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
Um so etwas wie Map zu haben, braucht ?mapply
man etwas ganz anderes. Um zB den Mittelwert jedes Elements in X zu erhalten, aber mit einem anderen Zuschnitt, könnten Sie Folgendes verwenden:
> mapply(mean,X,trim=c(0,0.5,0.1))
[1] 2 5 8
do.call
fast das gleiche wieapply
in Lisp