将R中的对象可视化为树

时间:2018-07-31 08:04:13

标签: r list tree visualization

我想将R对象(嵌套列表)可视化为树。考虑以下列表

x <- list(
  id = 1,
  status = "active",
  coord = list(phi=0, theta=1, r=1),
  mt = NULL
)

我想看看它的结构,而不是实际值。我可以使用data.tree库以一种绕行方式实现此目标:

library(data.tree)
dt <- list(
  name = "x",
  children = list(
    list(name = "id"),
    list(name = "status"),
    list(name = "coord",
      children = list(
        list(name = "phi"),
        list(name = "theta"),
        list(name = "r")
      )
    ),
    list(name = "mt")
  )
)

plot(FromListExplicit(dt))

这是结果:

tree image link

但是,这相当复杂。这种方法的问题在于,用于创建树状图(对象dt)的代码与我的实际代码(对象x)分离。随着代码的发展和对象的变化,我希望它们在当前状态下快速可视化(例如,在Rmarkdown文档中)。

有没有办法将嵌套列表的结构绘制为树?或者,也许有人可以建议将我的原始对象转换为适合data.tree的列表的函数,即将x转换为dt。 las,我的树遍历技能不是很好。

1 个答案:

答案 0 :(得分:0)

我花了一些时间玩代码,我想我找到了 a 解决方案。函数toTree将嵌套列表x转换为可提供给data.tree的列表。

depth <- function(x) ifelse(is.list(x), 1 + max(sapply(x, depth)), 0)

toTree <- function(x) {
  d <- depth(x)
  if(d > 1) {
    lapply(x, toTree)
  } else {
    children = lapply(names(x), function(nm) list(name=nm))
  }
}

现在,我可以快速绘图。这次我使用FromListSimple

dt <- FromListSimple(toTree(x), nodeName = "x")
plot(dt)

我想知道是否有人可以提出一个更优雅的解决方案。