2017-02-15 78 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]] 
    ) 
    } 
    }