What's the difference between lapply and do.call?
functional-programming, r
Solution
There is a function called `Map` that may be similar to map in other languages:
`lapply` returns a list of the same length as X, each element of which is the result of applying FUN to the corresponding element of X.
`do.call` constructs and executes a function call from a name or a function and a list of arguments to be passed to it.
`Map` applies a function to the corresponding elements of given vectors... `Map` is a simple wrapper to `mapply` which does not attempt to simplify the result, similar to Common Lisp's mapcar (with arguments being recycled, however). Future versions may allow some control of the result type.
- `Map` is a wrapper around `mapply`
- `lapply` is a special case of `mapply`
- Therefore `Map` and `lapply` will be similar in many cases.
For example, here is `lapply`:
lapply(iris, class)
$Sepal.Length
[1] "numeric"
$Sepal.Width
[1] "numeric"
$Petal.Length
[1] "numeric"
$Petal.Width
[1] "numeric"
$Species
[1] "factor"
And the same using `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` takes a function as input and splatters its other arguments to the function. It is widely used, for example, to assemble lists into simpler structures (often with `rbind` or `cbind`).
For example:
x <- lapply(iris, class)
do.call(c, x)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
"numeric" "numeric" "numeric" "numeric" "factor"
Problem
I'm learning R recently and confused by two function: `lapply`and `do.call`. It seems that they're just similar to `map` function in Lisp. But why are there two functions with such a different name? Why doesn't R just use a function called `map`?