2017-02-15 110 views
0

我试图在R中查找或编写与Map()相关的函数,该函数在应用函数时生成结果的嵌套列表。R中的递归映射

的R图的()函数运行如下:

Map(f, v, w, x) 
=> list(
     f(v1, w1, x1), 
     f(v2, w2, x2), ...) 

我想在在诉论证每一个组合来映射功能,W,X,等,并返回一个列表 - 顶级对应于诉条目列表,每个这些条目的应该是一个列表,包含的重量的每一级的条目,并在...

在代码中,我想

Map_recursive(f, v) == Map(f, v) == lapply(v, f) 
# 
# Map_recursive(c, c(a1=1, a2=2)) 
# => List(a1 = 1, a2 = 2) 

Map_recursive(f, v, w) 
== Map(function(vi) { 
    Map(f, vi, w) 
    }, v) 
== lapply(v, function(vi){ 
    lapply(w, function(wi) f(vi, wi)) 
    }) 
# 
# Map_recursive(c, c(a1 = 1, a2 = 2), c(b1=10, b2 = 20, b3 = 30)) 
# => List(
#  a1 = List(b1 = (1, 10), b2 = (1, 20), b3 = (1, 30)), 
#  a2 = List(b1 = (2, 10), b2 = (2, 20), b3 = (2, 30)) 
#  ) 

Map_recursive(f, v, w, x) == Map(function(vi){ 
    Map(function(wj){ 
     Map(f, vi, wj, x) 
     }, w)}, 
    v 
    ) 
# ... all the way down 

重要的是,联合国就像在Map中那样,迭代输入不需要有相同的长度(例如,v,w,x可以有不同的长度),并且不同数量的迭代输入应该是可能的。

我经历的事情如R搜索:: purrr和R ::功能,但我无法找到一个高阶函数,做什么,我需要

[R

+0

为什么你想递归地做到这一点,这又如何从函数的不同之处'申请'家庭是R的'地图'版本? –

+0

我可以看到使用该功能家族做我想做的事情的唯一方法是将lapply调用嵌套在对方内部,这很丑陋,必须进行硬编码才能使用不同数量的迭代器工作 –

+0

您的问题isn不太清楚,但它开始有意义。有问题的'f'应该适用于原子类型和'v','w'等嵌套列表具有相同的嵌套程度(例如表示树),然后您正在寻找一个map函数,它将采集一个集合例如并行树并返回一个通过将'f'应用于树叶而获得的相同结构的树? –

回答

1

请忽略这个问题。我现在的目的,我能够如下解决问题,(虽然我有严格命令的参数到f):

Map_recursive <- function(f, ...){ 
    require(purrr) 
    dots <- list(...) 
    if (length(dots) == 1){ 
    return(
     do.call("Map", args = append(list(f), dots)) 
    ) 
    } else { 
    Map(
     function(vi){ 
     new.f <- purrr::partial(f, vi) 
     do.call(
      "Map_recursive", 
      args = append(list(new.f), dots[-1]) 
     ) 
     }, 
     dots[[1]] 
    ) 
    } 
    }