簡體   English   中英

如何組合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結合使用的遞歸函數來實現這一點,只要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 ,它以遞歸方式循環遍歷單個列表。 但是為了同時遞歸地循環遍歷兩個列表,您需要更高級別的遞歸嗎? 我錯了嗎?

您可以遞歸地使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM