Answers:
有一个叫做的函数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.Length Sepal.Width Petal.Length Petal.Width Species
"numeric" "numeric" "numeric" "numeric" "factor"
do.call(cbind, x)
当前版本的最后一个例子给了我Error in do.call(c, x) : 'what' must be a function or character string
吗?
cbind()
与函数有所不同c()
,尽管它也可以工作,但结果却不同。
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,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
如果您使用lapply
,则R将应用于rbind
列表的每个元素,这给您带来了废话:
> lapply(X,rbind)
[[1]]
[,1] [,2] [,3]
[1,] 1 2 3
[[2]]
[,1] [,2] [,3]
[1,] 4 5 6
[[3]]
[,1] [,2] [,3]
[1,] 7 8 9
要拥有类似Map之类的东西,您需要?mapply
,这是完全不同的。要获取例如X中每个元素的均值,但修整不同,可以使用:
> mapply(mean,X,trim=c(0,0.5,0.1))
[1] 2 5 8
do.call
几乎一样apply
在Lisp中