Предположим, что я хочу обрезать дерево, состоящее из иерархии вложенных списков в R, на основе определенного критерия. Я могу сделать это достаточно "легко", используя lapply
:
# Based an example from the NetworkD3 documentation
# https://christophergandrud.github.io/networkD3/
URL <- paste0(
"https://cdn.rawgit.com/christophergandrud/networkD3/",
"master/JSONdata//flare.json")
flare <- jsonlite::fromJSON(URL, simplifyDataFrame = FALSE)
# Leaf nodes have a "size" attribute. Let's say we want to
# prune all the nodes with size < 5000.
prune <- function(tree) {
if ("children" %in% names(tree)) {
p <- lapply(tree$children, prune)
pp <- p[!unlist(lapply(p, is.null))]
copied_tree = list()
copied_tree$name = tree$name
copied_tree$children = pp
return(copied_tree)
} else if (tree$size < 5000) {
return(NULL)
}
return(tree)
}
pruned <- prune(flare)
В R for Data Science Хэдли Уикхэм обсуждает число сценариев, в которых purrr
может заменить семейство функций apply
для обработки иерархических данных. Однако эти примеры, похоже, имеют дело либо с одиночными вложенными списками, либо с конкретными узлами глубоко вложенных списков.
Есть ли способ использовать purrr
для выполнения рекурсивных задач, подобных описанной выше?
purrr::map
является заменойlapply
(с некоторыми дополнениями), но на самом деле это не изменит того, что вы здесь делаете. Вы можете проверитьrapply
, который является рекурсивным, но может быть немного привередливым, чтобы правильно работать. - person alistaire   schedule 11.01.2017purrr
части вопроса, а не «рекурсивной» части. Я думаю, чтоpurrr
не имеет такой рекурсивной функции по замыслу из соображений безопасности. - person Aurèle   schedule 11.01.2017rapply()
. Я посмотрю, смогу ли я придуматьrapply()
решение... - person Aurèle   schedule 11.01.2017