如何在R中递归地(通过嵌套列表)映射函数?

时间:2016-06-23 15:55:12

标签: r dictionary recursion mapreduce

免责声明:这不是此问题的重复: How to combine rapply() and mapply(), or how to use mapply/Map recursively? 在这个问题的基础上,我问如何将函数的额外参数合并到递归中。

所以我有名单:

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

我需要递归地应用不同的函数来保留列表结构。据推测,当函数为mean()时,执行此操作的递归函数就是这样:

recursive = function(x, y){
  if(is.null(y)){
    if(is.atomic(x)){
      x*x
    } else{
      Map(recursive, x)
    }
  } else{
    if(is.atomic(y) && is.atomic(x)){
      x*y
    } else{
      Map(recursive, x, y)
    }
  }
}

所以期望的结果是:

recursive(A,B)

我想知道如何将此递归推广到除了硬编码function(x,y) x*y之外的任何函数,以便我可以方便地更改函数? 在这种情况下,它将从:

开始
recursive = function(somefunction, x, y){
....
}

,其中

somefunction = function(x,y) x*y #or any other function taking x and y as inputs

有人可以告诉我一条出路吗?非常感谢你。

1 个答案:

答案 0 :(得分:1)

您可以使用

recursive  <- function(fun, x, y) {
    if(is.atomic(x) && is.atomic(y)) {
        match.fun(fun)(x, y) 
    } else  {
        Map(recursive, x, y, MoreArgs=list(fun=fun))
    }
}

原因是Map调用mapplymapplyMoreArgs=参数,您可以在其中指定要传递给调用函数的其他参数想要迭代。