Hay una función llamada Map
que puede ser similar a map en otros idiomas:
lapply
devuelve una lista de la misma longitud que X, cada elemento del cual es el resultado de aplicar FUN al elemento correspondiente de X.
do.call
construye y ejecuta una llamada de función a partir de un nombre o una función y una lista de argumentos que se le pasarán.
Map
aplica una función a los elementos correspondientes de vectores dados ... Map
es un contenedor simple al mapply
que no intenta simplificar el resultado, similar al mapcar de Common Lisp (sin embargo, con los argumentos que se reciclan). Las versiones futuras pueden permitir cierto control del tipo de resultado.
Map
es un envoltorio alrededor mapply
lapply
es un caso especial de mapply
- Por lo tanto
Map
y lapply
será similar en muchos casos.
Por ejemplo, aquí está lapply
:
lapply(iris, class)
$Sepal.Length
[1] "numeric"
$Sepal.Width
[1] "numeric"
$Petal.Length
[1] "numeric"
$Petal.Width
[1] "numeric"
$Species
[1] "factor"
Y lo mismo usando 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
toma una función como entrada y salpica sus otros argumentos a la función. Es ampliamente utilizado, por ejemplo, para ensamblar listas en estructuras más simples (a menudo conrbind
o cbind
).
Por ejemplo:
x <- lapply(iris, class)
do.call(c, x)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
"numeric" "numeric" "numeric" "numeric" "factor"
do.call
es casi lo mismo queapply
en Lispdo.call(cbind, x)
la versión actual me daError in do.call(c, x) : 'what' must be a function or character string
...cbind()
es diferente de la funciónc()
, y aunque esto también funciona, da resultados diferentes.lapply
aplica una función sobre una lista,do.call
llama a una función con una lista de argumentos. Eso me parece una gran diferencia ...Para dar un ejemplo con una lista:
Con lapply obtienes la media de cada elemento de la lista de esta manera:
do.call
da un error, ya que la media espera que el argumento "recortar" sea 1.Por otro lado,
rbind
une todos los argumentos rowwise. Entonces, para unir X rowwise, haces:Si lo usara
lapply
, R se aplicaríarbind
a cada elemento de la lista, dándole estas tonterías:Para tener algo como Mapa, necesitas
?mapply
, que es algo completamente diferente. Para obtener, por ejemplo, la media de cada elemento en X, pero con un recorte diferente, puede usar:fuente
lapply
es similar amap
,do.call
no lo es.lapply
aplica una función a todos los elementos de una lista,do.call
llama a una función donde todos los argumentos de la función están en una lista. Entonces, para unan
lista de elementos,lapply
tienen
llamadas a funciones ydo.call
solo tiene una llamada a funciones. Entoncesdo.call
es bastante diferente delapply
. Espero que esto aclare tu problema.Un ejemplo de código:
y:
fuente
En palabras más simples:
lapply () aplica una función dada para cada elemento en una lista, por lo que habrá varias llamadas a funciones.
do.call () aplica una función dada a la lista como un todo, por lo que solo hay una llamada a la función.
La mejor manera de aprender es jugar con los ejemplos de funciones en la documentación de R.
fuente
lapply()
Es una función de mapa.do.call()
es diferente. Se utiliza para pasar los argumentos a una función en forma de lista en lugar de enumerarlos. Por ejemplo,fuente
Aunque ha habido muchas respuestas, aquí está mi ejemplo de referencia. Supongamos que tenemos una lista de datos como:
La función lapply devuelve una lista.
Lo anterior significa algo como abajo.
Ahora hagamos lo mismo para do.call
Significa
En nuestro ejemplo, devuelve 21. En resumen, lapply siempre devuelve una lista, mientras que el tipo de retorno de do.call realmente depende de la función ejecutada.
fuente
La diferencia entre ambos es:
=> Este envío 1, parámetros para funcionar => esto envía 2, parámetros para funcionar, etc.
Solo envía 1 ... n como vector y parámetros para funcionar
Entonces, en apply, tienes n llamadas a funciones, en do.call solo tienes una
fuente