3

ある特定の基準に基づいて、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で、Hadley Wickhamは、階層データを処理するための一連の関数を置き換えることができるいくつかのシナリオについて説明しています。ただし、これらの例は、単独でネストされたリスト、または深くネストされたリストの特定のノードのいずれかを扱っているようです。purrrapply

purrr上記のような再帰的なタスクを達成するために使用する方法はありますか?

4

1 に答える 1

4
library(purrr)
prune_2 <- function(tree) {
  # print(tree$name)
  # print(map_lgl(tree$children, ~ "size" %in% names(.x)))
  tree$children %<>%  
    map_if(~ "children" %in% names(.x), prune_2) %>% 
    discard(~ if ("size" %in% names(.x)) .x$size < 5000 else FALSE)
  tree
}
pruned_2 <- prune_2(flare)
identical(pruned, pruned_2)
# [1] TRUE
于 2017-01-10T20:18:25.350 に答える