another quick experiment adding to these interactive javascript views of R partykit / rpart recursive partitioning / clustering.
For a couple other experiments see:
another quick experiment adding to these interactive javascript views of R partykit / rpart recursive partitioning / clustering.
For a couple other experiments see:
| # use mermaid.js to explain R rpart and other clustering | |
| # mermaid.js is a markdown-like language for flowcharts | |
| # http://github.com/knsv/mermaid | |
| library(htmltools) | |
| library(pipeR) | |
| library(rpart) | |
| library(partykit) | |
| # first we'll do the simple example offered in the Readme.md | |
| # note: this is an exact copy/paste of example | |
| tagList( | |
| tags$div( id = "mermaidChart", class = "mermaid" | |
| ,"graph LR; | |
| A[Hard edge]-->|Link text|B(Round edge); | |
| B-->C{Decision}; | |
| C-->|One|D[Result one]; | |
| C-->|Two|E[Result two]; | |
| " | |
| ) | |
| ,tags$script( | |
| ) | |
| ) %>>% | |
| attachDependencies( | |
| htmlDependency( | |
| name = "mermaid" | |
| ,version = "0.2.1" | |
| ,src = c("href"="http://www.sveido.com/mermaid/dist/") | |
| ,script = "mermaid.full.min.js" | |
| ) | |
| ) %>>% | |
| html_print | |
| # now let's see if we can integrate with rpart/partykit | |
| #set up a little rpart as an example | |
| rpk <- rpart( | |
| hp ~ cyl + disp + mpg + drat + wt + qsec + vs + am + gear + carb, | |
| method = "anova", | |
| data = mtcars, | |
| control = rpart.control(minsplit = 4) | |
| ) %>>% as.party | |
| # get partykit in source/target | |
| rpNet <- function(n){ | |
| l = unclass(n)$kids | |
| list.map(l, .$id) | |
| } | |
| nodeapply( | |
| rpk | |
| ,1:length(rpk) | |
| ,rpNet | |
| ) %>>% | |
| list.search(!is.null(.)) %>>% | |
| ( | |
| lapply( | |
| names(.), | |
| function(node){ | |
| data.frame( | |
| "source" = node | |
| ,"target" = unlist(.[[node]]) | |
| ) | |
| } | |
| ) | |
| ) %>>% | |
| list.stack -> rpk_sourcetarget | |
| # get descriptions for nodes | |
| rpk_text <- capture.output( print(rpk) ) %>>% | |
| ( .[grep( x = ., pattern = "(\\[)([0-9]*)(\\])")] ) %>>% | |
| strsplit( "[\\[\\|\\]]" , perl = T) %>>% | |
| list.map( | |
| tail(.,2) %>>% | |
| ( | |
| data.frame( | |
| "id" = as.numeric(.[1]) | |
| , description = .[2] | |
| , stringsAsFactors = F ) | |
| ) | |
| ) %>>% list.stack | |
| # will have to strip characters mermaid does not like | |
| # do separately to determine the secret reserved list | |
| rpk_text %>>% | |
| gsub( x= .[,"description"], pattern = "[()]",replacement = "") -> rpk_text[,"description"] | |
| tagList( | |
| tags$div( | |
| capture.output(print(rpk))[2:3] %>>% HTML | |
| ) | |
| ,tags$div( id = "mermaidChart", class = "mermaid" | |
| ,paste0( | |
| "graph LR;" | |
| ,paste0( | |
| apply(rpk_sourcetarget,MARGIN=1,function(node){ | |
| sprintf( | |
| "%s[%s]-->%s[%s];" | |
| ,LETTERS[node[["source"]]%>>%as.numeric] | |
| ,rpk_text[node[["source"]]%>>%as.numeric,"description"] | |
| ,LETTERS[node[["target"]]%>>%as.numeric] | |
| ,rpk_text[node[["target"]]%>>%as.numeric,"description"] | |
| ) | |
| }) | |
| ,collapse="\n" | |
| ) | |
| ) %>>% HTML | |
| ) | |
| ,tags$script( | |
| ) | |
| ) %>>% | |
| attachDependencies( | |
| htmlDependency( | |
| name = "mermaid" | |
| ,version = "0.2.1" | |
| ,src = c("href"="http://www.sveido.com/mermaid/dist/") | |
| ,script = "mermaid.full.min.js" | |
| ) | |
| ) %>>% | |
| html_print |
| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <meta charset="utf-8"/> | |
| <script src="http://www.sveido.com/mermaid/dist/mermaid.full.min.js"></script> | |
| </head> | |
| <body> | |
| <div>Model formula: hp ~ cyl + disp + mpg + drat + wt + qsec + vs + am + gear + carb</div> | |
| <div id="mermaidChart" class="mermaid">graph LR;A[ root]-->B[ cyl < 7]; | |
| A[ root]-->I[ cyl >= 7]; | |
| B[ cyl < 7]-->C[ mpg >= 21.45]; | |
| B[ cyl < 7]-->F[ mpg < 21.45]; | |
| C[ mpg >= 21.45]-->D[ disp < 87.05: 62.250 n = 4, err = 140.8]; | |
| C[ mpg >= 21.45]-->E[ disp >= 87.05: 91.833 n = 6, err = 1376.8]; | |
| F[ mpg < 21.45]-->G[ qsec >= 15.98: 112.857 n = 7, err = 306.9]; | |
| F[ mpg < 21.45]-->H[ qsec < 15.98: 175.000 n = 1, err = 0.0]; | |
| I[ cyl >= 7]-->J[ drat < 3.18]; | |
| I[ cyl >= 7]-->M[ drat >= 3.18]; | |
| J[ drat < 3.18]-->K[ mpg >= 12.8: 170.000 n = 7, err = 1150.0]; | |
| J[ drat < 3.18]-->L[ mpg < 12.8: 210.000 n = 2, err = 50.0]; | |
| M[ drat >= 3.18]-->N[ carb < 6: 246.000 n = 4, err = 582.0]; | |
| M[ drat >= 3.18]-->O[ carb >= 6: 335.000 n = 1, err = 0.0];</div> | |
| <script></script> | |
| </body> | |
| </html> |