【问题标题】:Visualise object in R as tree将 R 中的对象可视化为树
【发布时间】:2019-01-07 13:18:56
【问题描述】:

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

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

我想查看它的结构,而不是实际值。我可以使用data.tree library 以迂回的方式实现这一点:

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))

这是结果:

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

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

【问题讨论】:

    标签: r list tree visualization


    【解决方案1】:

    我对代码进行了一些尝试,我想我找到了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)
    

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

    【讨论】:

    • 这看起来是个好方法。有些网络包可以达到您所追求的相同结果,但在我使用的那些中,您需要将数据转换为包自己的结构,这至少与您的方法一样涉及,如果不是更多的话。我不知道任何会直接从嵌套列表中绘制的东西。
    猜你喜欢
    • 1970-01-01
    • 2020-04-28
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 2021-12-18
    • 2021-09-18
    • 2017-03-15
    相关资源
    最近更新 更多