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
?
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
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"