如何将一个函数应用于多个列表并获得一个列表作为 R 中的输出?
How applying a function to multiple lists and get a list as the output in R?
我有两个列表 A 和 B,每个列表都有 100 个元素。每个元素都是一个方阵,N in N。我想将列表 A 中的元素 i 与列表 B 中的元素 i 相乘(I 在 1 到 100 之间)并以包含 100 个元素的列表作为输出。
我如何使用应用函数来做到这一点?例如,lapply、sapply、mapply、...
正如 RonakShah 在评论中所说,Map
可能是这里的答案。
这样想:lapply
对一个列表的每个元素应用一个函数:
myfunc <- function(x) {
# do something with x
}
lapply(1:4, myfunc)
## unrolls to be the equivalent of ...
list(
myfunc(1),
myfunc(2),
myfunc(3),
myfunc(4)
)
然而,Map
将多个列表的每个 n
元素“压缩”在一起。使用 Map
相当于上面的 lapply
是
Map(myfunc, 1:4)
但还有很多。
myfunc_many <- function(x, y, z) {
# do something with all three args
}
Map(myfunc_many, 1:4, 11:14, 21:24)
## unrolls to
list(
myfunc_many(1, 11, 21),
myfunc_many(2, 12, 22),
myfunc_many(3, 13, 23),
myfunc_many(4, 14, 24)
)
Map
可以处理任意数量的列表;如果你的函数是 variadic (接受任意数量的参数),它仍然可以工作(尽管你的函数必须有处理它的内置机制,使其可变):
myfunc_variadic <- function(...) {
dots <- list(...)
# do something with dots
}
Map(myfunc_variadic, 1:4)
Map(myfunc_variadic, 1:4, 11:14)
Map(myfunc_variadic, 1:4, 11:14, 21:24, 31:34, 41:44)
在上面的所有示例中,我都使用向量作为每个参数,但它同样适用于事物列表。最后一个例子,
set.seed(42)
L1 <- replicate(2, matrix(sample(6), nrow = 2), simplify = FALSE)
L2 <- replicate(2, matrix(sample(6), nrow = 2), simplify = FALSE)
L1
# [[1]]
# [,1] [,2] [,3]
# [1,] 1 6 2
# [2,] 5 4 3
# [[2]]
# [,1] [,2] [,3]
# [1,] 2 1 5
# [2,] 6 3 4
L2
# [[1]]
# [,1] [,2] [,3]
# [1,] 4 5 3
# [2,] 1 2 6
# [[2]]
# [,1] [,2] [,3]
# [1,] 2 1 5
# [2,] 3 4 6
Map(`*`, L1, L2)
# [[1]]
# [,1] [,2] [,3]
# [1,] 4 30 6
# [2,] 5 8 18
# [[2]]
# [,1] [,2] [,3]
# [1,] 4 1 25
# [2,] 18 12 24
我有两个列表 A 和 B,每个列表都有 100 个元素。每个元素都是一个方阵,N in N。我想将列表 A 中的元素 i 与列表 B 中的元素 i 相乘(I 在 1 到 100 之间)并以包含 100 个元素的列表作为输出。
我如何使用应用函数来做到这一点?例如,lapply、sapply、mapply、...
正如 RonakShah 在评论中所说,Map
可能是这里的答案。
这样想:lapply
对一个列表的每个元素应用一个函数:
myfunc <- function(x) {
# do something with x
}
lapply(1:4, myfunc)
## unrolls to be the equivalent of ...
list(
myfunc(1),
myfunc(2),
myfunc(3),
myfunc(4)
)
然而,Map
将多个列表的每个 n
元素“压缩”在一起。使用 Map
相当于上面的 lapply
是
Map(myfunc, 1:4)
但还有很多。
myfunc_many <- function(x, y, z) {
# do something with all three args
}
Map(myfunc_many, 1:4, 11:14, 21:24)
## unrolls to
list(
myfunc_many(1, 11, 21),
myfunc_many(2, 12, 22),
myfunc_many(3, 13, 23),
myfunc_many(4, 14, 24)
)
Map
可以处理任意数量的列表;如果你的函数是 variadic (接受任意数量的参数),它仍然可以工作(尽管你的函数必须有处理它的内置机制,使其可变):
myfunc_variadic <- function(...) {
dots <- list(...)
# do something with dots
}
Map(myfunc_variadic, 1:4)
Map(myfunc_variadic, 1:4, 11:14)
Map(myfunc_variadic, 1:4, 11:14, 21:24, 31:34, 41:44)
在上面的所有示例中,我都使用向量作为每个参数,但它同样适用于事物列表。最后一个例子,
set.seed(42)
L1 <- replicate(2, matrix(sample(6), nrow = 2), simplify = FALSE)
L2 <- replicate(2, matrix(sample(6), nrow = 2), simplify = FALSE)
L1
# [[1]]
# [,1] [,2] [,3]
# [1,] 1 6 2
# [2,] 5 4 3
# [[2]]
# [,1] [,2] [,3]
# [1,] 2 1 5
# [2,] 6 3 4
L2
# [[1]]
# [,1] [,2] [,3]
# [1,] 4 5 3
# [2,] 1 2 6
# [[2]]
# [,1] [,2] [,3]
# [1,] 2 1 5
# [2,] 3 4 6
Map(`*`, L1, L2)
# [[1]]
# [,1] [,2] [,3]
# [1,] 4 30 6
# [2,] 5 8 18
# [[2]]
# [,1] [,2] [,3]
# [1,] 4 1 25
# [2,] 18 12 24