Istnieje funkcja o nazwie, Map
która może być podobna do mapy w innych językach:
lapply
zwraca listę o tej samej długości co X, której każdy element jest wynikiem zastosowania FUN do odpowiedniego elementu X.
do.call
konstruuje i wykonuje wywołanie funkcji z nazwy lub funkcji oraz listy argumentów, które mają być do niej przekazane.
Map
stosuje funkcję do odpowiednich elementów danych wektorów ... Map
jest prostym opakowaniem, mapply
które nie próbuje uprościć wyniku, podobnie jak mapcar Common Lispa (jednak z odzyskiwaniem argumentów). Przyszłe wersje mogą pozwolić na pewną kontrolę nad typem wyniku.
Map
jest opakowaniem wokół mapply
lapply
jest szczególnym przypadkiem mapply
- Dlatego
Map
iw lapply
wielu przypadkach będzie podobnie.
Na przykład tutaj jest lapply
:
lapply(iris, class)
$Sepal.Length
[1] "numeric"
$Sepal.Width
[1] "numeric"
$Petal.Length
[1] "numeric"
$Petal.Width
[1] "numeric"
$Species
[1] "factor"
I to samo używając 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
przyjmuje funkcję jako dane wejściowe i rozdziela jej inne argumenty na funkcję. Jest szeroko stosowany na przykład do tworzenia list w prostsze struktury (często z rozszerzeniemrbind
lub cbind
).
Na przykład:
x <- lapply(iris, class)
do.call(c, x)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
"numeric" "numeric" "numeric" "numeric" "factor"
do.call
to prawie to samo coapply
w Lispdo.call(cbind, x)
obecną wersją, która daje miError in do.call(c, x) : 'what' must be a function or character string
...cbind()
różni się od funkcjic()
i chociaż to również działa, daje inne wyniki.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ą:
Z lapply otrzymujesz średnią każdego elementu na liście w ten sposób:
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:Gdybyś użył
lapply
, R miałoby zastosowanierbind
do każdego elementu listy, co daje taki nonsens: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ć:źródło
lapply
jest podobny domap
,do.call
nie jest.lapply
stosuje funkcję do wszystkich elementów listy,do.call
wywołuje funkcję, w której wszystkie argumenty funkcji znajdują się na liście. Więc dlan
listy elementówlapply
man
wywołania funkcji ido.call
ma tylko jedno wywołanie funkcji. Więcdo.call
różni się odlapply
. Mam nadzieję, że to wyjaśnia twój problem.Przykład kodu:
i:
źródło
Najprościej mówiąc:
lapply () stosuje daną funkcję dla każdego elementu na liście, więc będzie kilka wywołań funkcji.
do.call () stosuje daną funkcję do listy jako całości, więc jest tylko jedno wywołanie funkcji.
Najlepszym sposobem nauki jest zabawienie się z przykładami funkcji w dokumentacji języka R.
źródło
lapply()
jest funkcją podobną do mapy.do.call()
jest inny. Służy do przekazywania argumentów do funkcji w formie listy zamiast ich wyliczania. Na przykład,źródło
Chociaż odpowiedzi było wiele, oto mój przykład w celach informacyjnych. Załóżmy, że mamy listę danych jako:
Funkcja lapply zwraca listę.
Powyższe oznacza coś takiego jak poniżej.
Zróbmy teraz to samo dla do.call
To znaczy
W naszym przykładzie zwraca 21. Krótko mówiąc, lapply zawsze zwraca listę, podczas gdy typ zwracania funkcji do.call naprawdę zależy od wykonywanej funkcji.
źródło
Różnica między nimi to:
=> Wysyła 1, parametry do funkcji => wysyła 2, parametry do funkcji i tak dalej
Po prostu wysyła 1… n jako wektor i parametry do działania
Więc w stosowaniu masz n wywołań funkcji, w do.call masz tylko jedno
źródło