我想将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))
这是结果:
但是,这相当复杂。这种方法的问题在于,用于创建树状图(对象dt
)的代码与我的实际代码(对象x
)分离。随着代码的发展和对象的变化,我希望它们在当前状态下快速可视化(例如,在Rmarkdown文档中)。
有没有办法将嵌套列表的结构绘制为树?或者,也许有人可以建议将我的原始对象转换为适合data.tree
的列表的函数,即将x
转换为dt
。 las,我的树遍历技能不是很好。
答案 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)
我想知道是否有人可以提出一个更优雅的解决方案。