如何结合rapply()和mapply(),或者如何递归使用mapply/Map?
How to combine rapply() and mapply(), or how to use mapply/Map recursively?
我想知道是否有一种简单的方法可以结合 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)))
我认为这应该是 rapply(x, f, how = "replace")
的 mapply()
模拟,但不知道如何整合它们。任何人都可以给我一些指示吗?
另一个简单的问题是,对于密集计算、嵌套列表或多维数组,哪个通常更快?非常感谢任何评论!
您可以递归地(两次)使用 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
.
或者你可以写一个递归函数结合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
,它递归地循环遍历单个列表。但是为了同时递归地循环遍历两个列表,你需要更高层次的递归?我错了吗?
我想知道是否有一种简单的方法可以结合 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)))
我认为这应该是 rapply(x, f, how = "replace")
的 mapply()
模拟,但不知道如何整合它们。任何人都可以给我一些指示吗?
另一个简单的问题是,对于密集计算、嵌套列表或多维数组,哪个通常更快?非常感谢任何评论!
您可以递归地(两次)使用 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
.
或者你可以写一个递归函数结合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
,它递归地循环遍历单个列表。但是为了同时递归地循环遍历两个列表,你需要更高层次的递归?我错了吗?