Há uma função chamada Map
que pode ser semelhante ao mapa em outros idiomas:
lapply
retorna uma lista do mesmo tamanho que X, cada elemento resultante da aplicação de FUN ao elemento correspondente de X.
do.call
constrói e executa uma chamada de função a partir de um nome ou uma função e uma lista de argumentos a serem passados para ele.
Map
aplica uma função aos elementos correspondentes de determinados vetores ... Map
é um invólucro simples para o mapply
qual não tenta simplificar o resultado, semelhante ao mapcar do Common Lisp (com argumentos sendo reciclados, no entanto). Versões futuras podem permitir algum controle do tipo de resultado.
Map
é um invólucro mapply
lapply
é um caso especial de mapply
- Portanto
Map
e lapply
será semelhante em muitos casos.
Por exemplo, aqui está lapply
:
lapply(iris, class)
$Sepal.Length
[1] "numeric"
$Sepal.Width
[1] "numeric"
$Petal.Length
[1] "numeric"
$Petal.Width
[1] "numeric"
$Species
[1] "factor"
E o mesmo 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
recebe uma função como entrada e espalha seus outros argumentos para a função. É amplamente utilizado, por exemplo, para montar listas em estruturas mais simples (geralmente com rbind
ou cbind
).
Por exemplo:
x <- lapply(iris, class)
do.call(c, x)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
"numeric" "numeric" "numeric" "numeric" "factor"
do.call
é quase o mesmo queapply
em Lispdo.call(cbind, x)
a versão atual me dáError in do.call(c, x) : 'what' must be a function or character string
...cbind()
é diferente da funçãoc()
e, embora isso também funcione, fornece resultados diferentes.lapply
aplica uma função sobre uma lista,do.call
chama uma função com uma lista de argumentos. Isso parece uma grande diferença para mim ...Para dar um exemplo com uma lista:
Com lapply, você obtém a média de cada elemento da lista como este:
do.call
gera um erro, pois a média espera que o argumento "trim" seja 1.Por outro lado,
rbind
liga todos os argumentos na linha. Então, para ligar o X rowwise, você deve:Se você usasse
lapply
, R se aplicariarbind
a todos os elementos da lista, dando a você essa bobagem:Para ter algo como Map, você precisa
?mapply
, que é algo totalmente diferente. Para obter, por exemplo, a média de cada elemento em X, mas com um corte diferente, você pode usar:fonte
lapply
é semelhante amap
,do.call
não é.lapply
aplica uma função a todos os elementos de uma lista,do.call
chama uma função em que todos os argumentos da função estão em uma lista. Portanto, para uman
lista de elementos,lapply
possuin
chamadas de função edo.call
possui apenas uma chamada de função. Então,do.call
é bem diferente delapply
. Espero que isso esclareça seu problema.Um exemplo de código:
e:
fonte
Nas palavras mais simples:
lapply () aplica uma determinada função para cada elemento em uma lista, portanto haverá várias chamadas de função.
do.call () aplica uma determinada função à lista como um todo, portanto, há apenas uma chamada de função.
A melhor maneira de aprender é brincar com os exemplos de funções na documentação do R.
fonte
lapply()
é uma função parecida com um mapa.do.call()
é diferente. É usado para passar os argumentos para uma função em forma de lista em vez de tê-los enumerados. Por exemplo,fonte
Embora tenha havido muitas respostas, aqui está o meu exemplo para referência. Suponha que tenhamos uma lista de dados como:
A função lapply retorna uma lista.
O acima significa algo como abaixo.
Agora vamos fazer a mesma coisa para do.call
Isso significa
No nosso exemplo, ele retorna 21. Em resumo, lapply sempre retorna uma lista, enquanto o tipo de retorno do.call realmente depende da função executada.
fonte
A diferença entre ambos são:
=> Envia 1, parâmetros para funcionar => envia 2, parâmetros para funcionar e assim por diante
Apenas envia 1… n como vetor e parâmetros para funcionar
Portanto, em apply você tem n chamadas de função, em do.call você tem apenas um
fonte