假设我想要根据特定的标准修剪一个由嵌套列表组成的树形结构,在R中可以使用轻松实现:
在《R数据科学》一书中,Hadley Wickham 讨论了许多场景,其中
是否有一种方法可以使用
# 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数据科学》一书中,Hadley Wickham 讨论了许多场景,其中
purrr
可以替代apply
函数族来处理分层数据。然而,这些例子似乎只涉及单层嵌套列表或深度嵌套列表的特定节点。是否有一种方法可以使用
purrr
来完成像上面讨论的递归任务?
purrr::map
是lapply
的替代品(带有一些额外功能),但它并不会真正改变你在这里所做的事情。你可以尝试使用rapply
,它是递归的,但可能需要一些技巧才能正确地工作。 - alistairepurrr
部分,而不是“递归”部分。我认为这是purrr
缺乏递归功能的设计原因,因为存在“安全性”问题。 - Aurèlerapply()
。我将看看是否可以想出一个rapply()
解决方案... - Aurèle