How to combine rapply() and mapply(), or how to use mapply/Map recursively?

六眼飞鱼酱① 提交于 2019-12-19 03:38:18

问题


I was wondering if there's a simple way to combine the functions of rapply( , how = "replace") and mapply(), in order to use mapply() on nested lists recursively.

For instance, I have two nested lists:

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)))

Let's say I want to apply function(x, y) x + y to all the corresponding elements in A and B and preserve the nested structure. The desired result would be

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

I think this should be a mapply() analog of rapply(x, f, how = "replace"), but couldn't figure out how to integrate them. Could anyone kindly give me some pointers on this?

Another quick question is, which is usually faster for intensive computation, nested lists or multidimensional arrays? Any comments are very much appreciated!


回答1:


Or you can write a recursive function combined with Map to achieve this, which works as long as A and B have the same structure:

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

Not sure if you can use rapply in this case, which loops through a single list recursively. But in order to loop through two lists recursively at the same time, you need a higher level of recursion? Am I wrong?




回答2:


You can use Map recursively (twice) to accomplish this:

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

To use mapply, you would need simplify=FALSE, but that is the default for Map. The outer list elements are fed to the first Map and the inner list elements are fed to the second Map.



来源:https://stackoverflow.com/questions/37906958/how-to-combine-rapply-and-mapply-or-how-to-use-mapply-map-recursively

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!