厌伴老儒烹瓠叶,强随举子踏槐花。这篇文章主要讲述lapply和do.call有什么区别?相关的知识,希望能为你提供帮助。
我最近在学习R并且被两个函数搞糊涂了:lapply
and do.call
。它们似乎与Lisp中的map
函数类似。但为什么有两个具有不同名称的函数?为什么R只使用一个名为map
的函数?
答案有一个名为Map
的函数可能类似于其他语言的映射:
lapply
返回与X相同长度的列表,其中每个元素都是将FUN应用于X的相应元素的结果。do.call
构造并执行来自名称或函数的函数调用以及要传递给它的参数列表。Map
将一个函数应用于给定向量的相应元素...Map
是mapply
的简单包装器,它不会尝试简化结果,类似于Common Lisp的mapcar(然而,参数被回收)。未来版本可能允许对结果类型进行一些控制。
Map
是mapply
的包装纸lapply
是mapply
的一个特例- 因此
Map
和lapply
在很多情况下会相似。
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
将一个函数作为输入,并将其其他参数泼洒到函数中。例如,它被广泛用于将列表组合成更简单的结构(通常使用rbind
或cbind
)。例如:
x <
- lapply(iris, class)
do.call(c, x)
Sepal.LengthSepal.Width Petal.LengthPetal.WidthSpecies
"numeric""numeric""numeric""numeric""factor"
另一答案
lapply
在列表中应用函数,do.call
使用参数列表调用函数。这看起来对我很不一样......举一个列表的例子:
X <
- list(1:3,4:6,7:9)
通过lapply,您可以获得列表中每个元素的均值:
>
lapply(X,mean)
[[1]]
[1] 2[[2]]
[1] 5[[3]]
[1] 8
do.call
给出一个错误,因为平均值要求参数“trim”为1。另一方面,
rbind
以行为方式绑定所有参数。所以要按行绑定X,你可以:>
do.call(rbind,X)
[,1] [,2] [,3]
[1,]123
[2,]456
[3,]789
如果你使用
lapply
,R会将rbind
应用于列表的每个元素,给你这个废话:>
lapply(X,rbind)
[[1]]
[,1] [,2] [,3]
[1,]123[[2]]
[,1] [,2] [,3]
[1,]456[[3]]
[,1] [,2] [,3]
[1,]789
要拥有像Map这样的东西,你需要
?mapply
,这是完全不同的东西。要获得例如X中每个元素的平均值,但是使用不同的修剪,您可以使用:>
mapply(mean,X,trim=c(0,0.5,0.1))
[1] 2 5 8
另一答案
lapply
类似于map
,do.call
不是。 lapply
将函数应用于列表的所有元素,do.call
调用一个函数,其中所有函数参数都在列表中。因此,对于n
元素列表,lapply
具有n
函数调用,而do.call
只有一个函数调用。所以do.call
与lapply
完全不同。希望这能澄清你的问题。一个代码示例:
do.call(sum, list(c(1, 2, 4, 1, 2), na.rm = TRUE))
和:
lapply(c(1, 2, 4, 1, 2), function(x) x + 1)
另一答案用最简单的话说:
- lapply()为列表中的每个元素应用给定函数,因此将有几个函数调用。
- do.call()将给定函数作为一个整体应用于列表,因此只有一个函数调用。
另一答案
lapply()
是一个类似地图的功能。 do.call()
与众不同。它用于将参数传递给列表形式的函数,而不是枚举它们。例如,>
do.call("+",list(4,5))
[1] 9
另一答案虽然有很多答案,但这是我的例子供参考。假设我们有一个数据列表:
L=list(c(1,2,3), c(4,5,6))
函数lapply返回一个列表。
lapply(L, sum)
以上意思如下。
list( sum( L[[1]]) , sum( L[[2]]))
现在让我们为do.call做同样的事情
do.call(sum, L)
它的意思是
sum( L[[1]], L[[2]])
在我们的示例中,它返回21.简而言之,lapply总是返回一个列表,而do.call的返回类型实际上取决于执行的函数。
另一答案两者之间的区别是:
lapply(1:n,function,parameters)
=> 这个发送1,参数到函数=> 这发送2,参数到功能等等
do.call
只需发送1 ... n作为矢量和参数即可运行
【lapply和do.call有什么区别()】所以在应用中你有n个函数调用,在do.call你只有一个
推荐阅读
- 如何在android Firestore上实现Paginate查询[重复]
- Android DatePicker显示月份名称
- 在Android上禁用蓝牙可发现模式
- 在Android 2.3上实现OBEX PUSH服务器
- Android和双模蓝牙设备(与BR / EDR(经典)配对时未找到自定义BLE服务)
- Android的多重连接
- Android - 检测我的应用的其他用户是否在附近
- 从android下载文件时出现套接字异常
- Android 3g下载和多线程