小编典典

lapply 和 do.call 有什么区别?

all

我最近在学习 R 并且对两个函数感到困惑:lapplydo.call. 看起来它们只是类似于mapLisp
中的函数。但是为什么会有两个名称如此不同的函数呢?为什么 R 不只使用一个名为 的函数map


阅读 74

收藏
2022-08-21

共1个答案

小编典典

有一个函数调用Map,可能类似于其他语言中的 map:

  • lapply返回一个与 X 长度相同的列表,其中每个元素是对 X 的相应元素应用 FUN 的结果。

  • do.call从名称或函数以及要传递给它的参数列表构造并执行函数调用。

  • Map将函数应用于给定向量的相应元素…Map是一个简单的包装器,mapply它不会尝试简化结果,类似于 Common Lisp 的 mapcar(但是,参数被回收)。未来的版本可能允许对结果类型进行一些控制。


  1. Map是一个包装器mapply
  2. lapply是一个特例mapply
  3. 因此Maplapply在许多情况下将是相似的。

例如,这里是lapply

lapply(iris, class)
$Sepal.Length
[1] "numeric"

$Sepal.Width
[1] "numeric"

$Petal.Length
[1] "numeric"

$Petal.Width
[1] "numeric"

$Species
[1] "factor"

同样使用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将一个函数作为输入,并将其其他参数传递给该函数。它被广泛使用,例如,将列表组装成更简单的结构(通常使用rbindor
cbind)。

例如:

x <- lapply(iris, class)
do.call(c, x)
Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
   "numeric"    "numeric"    "numeric"    "numeric"     "factor"
2022-08-21