如何组合rapply()和mapply(),或者如何递归地使用mapply / Map?

时间:2016-06-19 11:56:24

标签: r multidimensional-array mapreduce nested mapply

我想知道是否有一种简单的方法来组合rapply( , how = "replace")mapply()的功能,以便递归地在嵌套列表上使用mapply()

例如,我有两个嵌套列表:

A = list(list(c(1,2,3), c(2,3,4)), list(c(4,3,2), c(3,2,1)))
B = list(list(c(1,2,3), c(2,3,4)), list(c(4,3,2), c(3,2,1)))

假设我想将function(x, y) x + y应用于A和B中的所有相应元素并保留嵌套结构。期望的结果是

result = list(list(c(2,4,6), c(4,6,8)), list(c(8,6,4), c(6,4,2)))

我认为这应该是mapply()模拟rapply(x, f, how = "replace"),但无法弄清楚如何整合它们。有人可以给我一些指示吗?

另一个快速问题是,密集计算,嵌套列表或多维数组通常更快?任何评论都非常感谢!

2 个答案:

答案 0 :(得分:4)

或者您可以编写一个与Map结合使用的递归函数来实现这一点,只要A和B具有相同的结构,它就可以工作:

s <- function(x, y) tryCatch(x + y, error = function(e) Map(s, x, y))
s(A, B)

[[1]]
[[1]][[1]]
[1] 2 4 6

[[1]][[2]]
[1] 4 6 8


[[2]]
[[2]][[1]]
[1] 8 6 4

[[2]][[2]]
[1] 6 4 2

在这种情况下,不确定是否可以使用rapply,它会以递归方式循环遍历单个列表。但是为了同时递归地循环遍历两个列表,您需要更高级别的递归吗?我错了吗?

答案 1 :(得分:1)

您可以递归地使用Map(两次)来完成此任务:

Map(function(i, j) Map(function(x, y) x + y, i, j), A, B)

[[1]]
[[1]][[1]]
[1] 2 4 6

[[1]][[2]]
[1] 4 6 8


[[2]]
[[2]][[1]]
[1] 8 6 4

[[2]][[2]]
[1] 6 4 2

要使用mapply,您需要simplify = FALSE,但这是Map的默认值。外部列表元素被馈送到第一个Map,内部列表元素被馈送到第二个Map