在R中将rpart输出转换为JSON格式

时间:2015-12-10 08:05:46

标签: javascript json r

我必须以交互模式绘制决策树,我可以在JavaScript中绘制,但为了做到这一点,我需要Json格式的rpart对象。

所以我想使用一些库将rpart输出转换为JSON格式。

model <- rpart(formula=Species~Sepal.Length+Sepal.Width+Petal.Length+  
         Petal.Width,data=iris,na.action = na.rpart, method = "class",  
         parms = list(split="gini"),  
         control = rpart.control(minsplit= 10, cp= 0.005))

print(model)

输出

 n= 150 

  node), split, n, loss, yval, (yprob)
      * denotes terminal node

 1) root 150 100 setosa (0.33333333 0.33333333 0.33333333)  
   2) PetalLength< 2.45 50   0 setosa (1.00000000 0.00000000 0.00000000) *
   3) PetalLength>=2.45 100  50 versicolor (0.00000000 0.50000000 0.50000000)  
     6) PetalWidth< 1.75 54   5 versicolor (0.00000000 0.90740741 0.09259259)  
      12) PetalLength< 4.95 48   1 versicolor (0.00000000 0.97916667 0.02083333) *
      13) PetalLength>=4.95 6   2 virginica (0.00000000 0.33333333 0.66666667) *
     7) PetalWidth>=1.75 46   1 virginica (0.00000000 0.02173913 0.97826087) *

任何人都可以告诉我如何将rpart对象转换为Json?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

我们可以使用递归函数手动编写JSON解析器。这是一个小例子。请注意以下内容;

  1. 编写解析器对于“派对”对象比对“rpart”对象更容易。幸运的是,我们可以使用as.party()

  2. 将任何“rpart”对象转换为“party”
  3. 这只是一个显示功能的简单实现。我们可以在每个节点添加其他功能,如node_size,node_parent等。

    install.packages('partykit')    
    json_prsr <- function(tree, node = 1, node_stats = NULL){
    
        # Checking the decision tree object
        if(!is(tree, c("constparty","party")))
            tree <- partykit::as.party(tree)
    
        # Parsing into json format
        str  <- ""
        rule <- partykit:::.list.rules.party(tree, node)
    
        if(is.null(node_stats))
            node_stats <- table(tree$fitted[1])
        children <- partykit::nodeids(tree, node)
    
        if (length(children) == 1) {
            ct  <- node_stats[as.character(children)]
            str <- paste("{","'name': '",children,"','size':",ct,",'rule':'",rule,"'}", sep='')
        } else {
            str <- paste("{","'name': '", node,"', 'rule': '", rule, "', 'children': [", sep='')
            for(child in children){
                check <- paste("{'name': '", child, "'", sep='')
                if(child != node & ( !grepl(check, str, fixed=TRUE) ) ) {
                    child_str <- json_prsr(tree, child, node_stats)
                    str <- paste(str, child_str, ',', sep='')
                }
            }
            str <- substr(str, 1, nchar(str)-1) #Remove the comma
            str <- paste(str,"]}", sep='')
        }
        return(str)
    }
    
  4. 通过粘贴http://jsonlint.com/

    处的json字符串来检查输出JSON的有效性