从列表中绘制R中的二叉树

时间:2014-06-17 19:28:50

标签: r

我有一个列表,我想把它绘制成一棵树。 这就是列表的样子:

> tree_list
[[1]]
[[1]][[1]]
[[1]][[1]][[1]]
[1]  2  9 10

[[1]][[1]][[2]]
[1] 5 8

[[1]][[2]]
[1] 1 3 4 6


[[2]]
[1] 7

整数1:10是树的节点。 [[1]]或[[2]]表示树的左侧或右侧。 谢谢!

1 个答案:

答案 0 :(得分:2)

好吧,我写了一个非常难看的功能,似乎就是这么做的。肯定有更好的办法。在这里,我基本上创造了一个假的"树"宾语。然后我尝试使用plot.tree中的默认text.treelibrary(tree)。事实证明,我必须添加一堆疯狂的值和属性才能足够令人信服地运行而不会出错。而且我甚至不确定这是你想要的行为。

library(tree)
gettree<-function(tree_list) {
    flatten<-function(x, node=1) {
        if(is.list(x)) {
            sub<-do.call(rbind, 
               lapply(1:2, function(i) flatten(x[[i]], node=node*2+i-1) ))
            rbind(data.frame(name=paste("split",node), nodeid=node,
               N=sum(as.numeric(sub$n)), n=0, vals=NA), sub)
        } else {
            data.frame(name="<leaf>", nodeid=node, N=0, n=length(x), vals=I(list(x)))
        }
    }
    ff<-flatten(tree_list)
    is.leaf <- grepl("<leaf>",ff$name)
    df<-data.frame(
        var=ff$name,
        n=pmax(ff$N,ff$n), dev=ff$n,
        yval=factor(sapply(ff$vals, paste, collapse=","))
    )
    df$splits<-matrix(cbind(ifelse(!is.leaf, "","left"), 
        ifelse(!is.leaf, "","right")), ncol=2,
        dimnames=list(NULL, c("cutleft","cutright")))
    rownames(df)<-ff$nodeid
    whmx <- do.call(rbind, mapply(cbind, seq_along(ff$vals), ff$vals))
    y<-factor(whmx[!is.na(whmx[,2]),2])
    wh<-as.numeric(whmx[!is.na(whmx[,2]),1])
    yf<-factor(df$yval)
    yprob <- matrix(0, ncol=nlevels(yf), nrow=length(yf))
    yprob[cbind(seq_along(yf), as.numeric(yf))]<-1
    df$yprob <- yprob
    structure(list(frame=df,y=y, where=wh),  class="tree", ylevels=levels(yf))
}

一旦我们定义了该功能,我们就可以使用您的数据运行它。

tree_list<-list(list(list(c(2,9,10), c(5,8)), c(1,3,4,6)), 7)

mt<-gettree(tree_list)

plot(mt, type="uniform")
text(mt, splits=F)

这就是这个情节

binary tree visualization

它的边缘仍然非常粗糙,但如果你真的感兴趣,也许你可以清理它。