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!
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?
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