Es gibt eine Funktion namens Map
, die der Karte in anderen Sprachen ähnlich sein kann:
lapply
Gibt eine Liste mit der gleichen Länge wie X zurück, deren jedes Element das Ergebnis der Anwendung von FUN auf das entsprechende Element von X ist.
do.call
erstellt und führt einen Funktionsaufruf aus einem Namen oder einer Funktion und einer Liste von Argumenten aus, die an ihn übergeben werden sollen.
Map
wendet eine Funktion auf die entsprechenden Elemente gegebener Vektoren an ... Map
ist ein einfacher Wrapper, mapply
der nicht versucht, das Ergebnis zu vereinfachen, ähnlich wie das Mapcar von Common Lisp (wobei jedoch Argumente recycelt werden). Zukünftige Versionen ermöglichen möglicherweise eine gewisse Kontrolle des Ergebnistyps.
Map
ist ein Wrapper herum mapply
lapply
ist ein Sonderfall von mapply
- Daher
Map
und lapply
wird in vielen Fällen ähnlich sein.
Zum Beispiel ist hier lapply
:
lapply(iris, class)
$Sepal.Length
[1] "numeric"
$Sepal.Width
[1] "numeric"
$Petal.Length
[1] "numeric"
$Petal.Width
[1] "numeric"
$Species
[1] "factor"
Und das gleiche mit 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
Nimmt eine Funktion als Eingabe und verteilt ihre anderen Argumente auf die Funktion. Es wird beispielsweise häufig verwendet, um Listen zu einfacheren Strukturen zusammenzustellen (häufig mit rbind
odercbind
).
Beispielsweise:
x <- lapply(iris, class)
do.call(c, x)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
"numeric" "numeric" "numeric" "numeric" "factor"
do.call
fast das gleiche wieapply
in Lispdo.call(cbind, x)
die aktuelle Version gibt mirError in do.call(c, x) : 'what' must be a function or character string
...cbind()
unterscheidet sich von der Funktionc()
, und obwohl dies auch funktioniert, liefert sie unterschiedliche Ergebnisse.lapply
Wendet eine Funktion auf eine Liste an unddo.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:
Mit lapply erhalten Sie den Mittelwert jedes Elements in der Liste wie folgt:
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:Wenn Sie verwenden würden
lapply
, würde R fürrbind
jedes Element der Liste gelten, was Ihnen diesen Unsinn gibt: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:quelle
lapply
ist ähnlichmap
,do.call
ist nicht.lapply
Wendet eine Funktion auf alle Elemente einer Liste an unddo.call
ruft eine Funktion auf, bei der sich alle Funktionsargumente in einer Liste befinden. Also für einen
Elementliste,lapply
hatn
Funktionsaufrufe unddo.call
hat nur einen Funktionsaufruf. Istdo.call
also ganz anders alslapply
. Hoffe, dies klärt Ihr Problem.Ein Codebeispiel:
und:
quelle
In einfachsten Worten:
lapply () wendet für jedes Element in einer Liste eine bestimmte Funktion an, sodass mehrere Funktionsaufrufe erfolgen.
do.call () wendet eine bestimmte Funktion auf die gesamte Liste an, sodass nur ein Funktionsaufruf vorhanden ist.
Der beste Weg zu lernen ist, mit den Funktionsbeispielen in der R-Dokumentation herumzuspielen.
quelle
lapply()
ist eine kartenähnliche Funktion.do.call()
ist anders. Es wird verwendet, um die Argumente in Listenform an eine Funktion zu übergeben, anstatt sie aufzählen zu lassen. Zum Beispiel,quelle
Obwohl es viele Antworten gab, ist hier mein Beispiel als Referenz. Angenommen, wir haben eine Liste von Daten als:
Die Funktion lapply gibt eine Liste zurück.
Das Obige bedeutet so etwas wie unten.
Lassen Sie uns jetzt dasselbe für do.call tun
Es bedeutet
In unserem Beispiel wird 21 zurückgegeben. Kurz gesagt, lapply gibt immer eine Liste zurück, während der Rückgabetyp von do.call wirklich von der ausgeführten Funktion abhängt.
quelle
Der Unterschied zwischen beiden ist:
=> Dies sendet 1, Parameter an Funktion => Dies sendet 2, Parameter an Funktion und so weiter
Sendet einfach 1… n als Vektor und Parameter zur Funktion
In apply haben Sie also n Funktionsaufrufe, in do.call haben Sie nur einen
quelle