Il existe une fonction appelée Map
qui peut être similaire à la carte dans d'autres langues:
lapply
renvoie une liste de même longueur que X, dont chaque élément est le résultat de l'application de FUN à l'élément correspondant de X.
do.call
construit et exécute un appel de fonction à partir d'un nom ou d'une fonction et une liste d'arguments à lui passer.
Map
applique une fonction aux éléments correspondants de vecteurs donnés ... Map
est un simple wrapper mapply
auquel ne tente pas de simplifier le résultat, similaire au mapcar de Common Lisp (avec des arguments recyclés cependant). Les versions futures peuvent permettre un certain contrôle du type de résultat.
Map
est une enveloppe autour mapply
lapply
est un cas particulier de mapply
- Par conséquent,
Map
et lapply
sera similaire dans de nombreux cas.
Par exemple, voici lapply
:
lapply(iris, class)
$Sepal.Length
[1] "numeric"
$Sepal.Width
[1] "numeric"
$Petal.Length
[1] "numeric"
$Petal.Width
[1] "numeric"
$Species
[1] "factor"
Et la même chose en utilisant Map
:
Map(class, iris)
$Sepal.Length
[1] "numeric"
$Sepal.Width
[1] "numeric"
$Petal.Length
[1] "numeric"
$Petal.Width
[1] "numeric"
$Species
[1] "factor"
do.call
prend une fonction comme entrée et éclabousse ses autres arguments sur la fonction. Il est largement utilisé, par exemple, pour assembler des listes en structures plus simples (souvent avec rbind
oucbind
).
Par exemple:
x <- lapply(iris, class)
do.call(c, x)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
"numeric" "numeric" "numeric" "numeric" "factor"
do.call
presque le même queapply
dans Lispdo.call(cbind, x)
la version actuelle me donneError in do.call(c, x) : 'what' must be a function or character string
...cbind()
est différente de la fonctionc()
, et bien que cela fonctionne également, cela donne des résultats différents.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:
Avec lapply, vous obtenez la moyenne de chaque élément de la liste comme ceci:
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:Si vous utilisiez
lapply
, R s'appliqueraitrbind
à chaque élément de la liste, vous donnant ce non-sens: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:la source
lapply
est similaire àmap
,do.call
n'est pas.lapply
applique une fonction à tous les éléments d'une liste,do.call
appelle une fonction où tous les arguments de la fonction sont dans une liste. Donc, pour unen
liste d'éléments,lapply
an
des appels de fonction etdo.call
n'a qu'un seul appel de fonction. C'est doncdo.call
assez différent delapply
. J'espère que cela clarifie votre problème.Un exemple de code:
et:
la source
En termes simples:
lapply () applique une fonction donnée pour chaque élément d'une liste, il y aura donc plusieurs appels de fonction.
do.call () applique une fonction donnée à la liste dans son ensemble, il n'y a donc qu'un seul appel de fonction.
La meilleure façon d'apprendre est de jouer avec les exemples de fonctions de la documentation R.
la source
lapply()
est une fonction de type carte.do.call()
est différent. Il est utilisé pour passer les arguments à une fonction sous forme de liste au lieu de les énumérer. Par exemple,la source
Bien qu'il y ait eu de nombreuses réponses, voici mon exemple pour référence. Supposons que nous ayons une liste de données comme:
La fonction lapply renvoie une liste.
Ce qui précède signifie quelque chose comme ci-dessous.
Maintenant, faisons la même chose pour do.call
Ça veut dire
Dans notre exemple, il renvoie 21. En bref, lapply retourne toujours une liste alors que le type de retour de do.call dépend vraiment de la fonction exécutée.
la source
La différence entre les deux sont:
=> Cet envoi 1, paramètres à fonction => cela envoie 2, paramètres à fonction et ainsi de suite
Envoie juste 1… n comme vecteur et paramètres pour fonctionner
Donc dans apply vous avez n appels de fonction, dans do.call vous n'en avez qu'un
la source