2017-02-15 4 views
0

Я пытаюсь найти или написать функцию, связанную с Map() в R, которая генерирует вложенный список результатов при применении функции.Рекурсивная карта в R

Функция R Map() работает следующим образом:

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

Я хотел бы Сопоставьте функции над каждой комбинации аргументов в V, W, X, и т.д., и возвращает список - верхний уровень из списка, соответствующей записи в V, каждый из этих записей должна быть список и содержать записи для каждого уровня ж, и на ...

в коде, я бы хотел

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 

Важно отметить, что un как и в Map, итерационные входы не должны иметь одинаковую длину (т. е. v, w, x могут иметь разную длину), и должно быть возможно различное количество итерируемых входов.

Я искал через такие вещи, как R :: purrr и R :: функциональны, но я не мог найти функцию высшего порядка, который делает то, что мне нужно

R

+0

Почему вы хотите это сделать рекурсивно, и как это отличается от функций семейство «apply», которое является версией (-ами) R «карты»? –

+0

Единственный способ, с помощью которого я мог бы использовать это семейство функций, чтобы делать то, что я хотел, - это встраивать вызовы друг в друга, что довольно уродливо и должно быть жестко закодировано для работы с разными номерами итераций. –

+0

. Ваш вопрос isn 'совершенно ясно, но это начинает иметь смысл. Предполагается ли, что 'f' должен применяться к атомным типам и' v', 'w' и т. Д. Вложенным спискам с одинаковой степенью вложенности (например, представляющие деревья), а затем вы ищете функцию карты, которая будет принимать коллекцию например параллельные деревья и вернуть дерево той же структуры, полученное путем применения '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]] 
    ) 
    } 
    }