【发布时间】:2018-02-05 13:07:51
【问题描述】:
我想知道是否有一种更有效的方法可以对列表的每两个连续元素应用一个函数。 This question引起了我的思考,我为用户发布的解决方案来自here。
我认为使用Map/mapply 和somelist[-length(somelist)] 和somelist[-1] 作为function(x, y) 调用的参数已经足够了,但是有没有直接的方法,可能在更大/更新的包之一中实现?
考虑这个例子(从上述问题中窃取):
我有一个包含三个矩阵的列表:
set.seed(1)
matlist <- list(M1 = matrix(sample(1:10, 4, replace = T), nrow = 2, ncol = 2),
M2 = matrix(sample(1:10, 4, replace = T), nrow = 2, ncol = 2),
M3 = matrix(sample(1:10, 4, replace = T), nrow = 2, ncol = 2)
)
现在我想计算M1+M2 和M2+M3。提到的方法是
Map(`+`, matlist[-3], matlist[-1])
[[1]]
[,1] [,2]
[1,] 5 11
[2,] 11 15
[[2]]
[,1] [,2]
[1,] 12 13
[2,] 5 18
是否有任何 apply 家族的变体可供我喂食
xapply(matlist, `+`)
我知道我可以自己写一个小帮手,比如
xapply <- function(x, FUN){
Map(FUN, x[-length(x)], x[-1])
}
但据我了解,this classic、sapply/lapply 等通过使用C 代码获得了优于for 循环的性能优势,因此上面的xapply 函数只是方便,不会提高性能.
【问题讨论】:
-
你创建的函数有什么问题。正确编写
for和sapply/lapply不会有太大的性能优势 -
它本身没有问题,我只是想知道这种循环
x和x+1的方式是否已经以任何优化的方式实现了。 -
请注意
Map已经属于apply家族,只需调用mapply -
是的,我只是使用
Map来避免默认的SIMPLIFY = TRUE。