树形图显示在R中,但不在R-Shiny中

时间:2016-09-23 20:11:47

标签: r shiny

我可以使用data.tree包来制作情节。这是一个情节的例子:

library(data.tree)

org <- Node$new("Parent")
org$AddChild("Child_1")
org$AddChild("Child_2")

plot(org)

但是,我无法在R-Shiny中渲染这个情节。我已经能够渲染Shiny中的大多数其他情节。我该怎么做才能渲染这个情节,为什么它没有出现?这是我的闪亮代码:

library(shiny); library(data.tree)

ui <- fluidPage(
    mainPanel(plotOutput("orgplot") )
)

server <- function(input, output){
  rv <- reactiveValues()

  org <- Node$new("Parent")
  org$AddChild("Child_1")
  org$AddChild("Child_2")

  output$orgplot <- renderPlot({ plot(org)})
}

shinyApp(ui = ui, server = server)         

2 个答案:

答案 0 :(得分:4)

plot(org)生成类grViz的小部件所以您可以使用renderGrViz来显示闪亮的情节。

赞(textInput用于更改名称“parent”的示例)

  library(shiny); 
library(data.tree)
library(DiagrammeR)
ui <- fluidPage(
  mainPanel(grVizOutput("xx")   ),
  textInput("parent","parent","parent")
)

server <- function(input, output){
output$xx=renderGrViz({
  org <- Node$new(input$parent)
  org$AddChild("Child_1")
  org$AddChild("Child_2")
  grViz(ToGraphViz(org),engine = "dot")
  })
}


shinyApp(ui = ui, server = server) 

动态更新添加节点

如果要动态添加节点,可以尝试按名称添加子节点(需要进行一些检查以避免名称重复)

绘制图表的新功能来自@rpm answer

 ui <- fluidPage(
  mainPanel(uiOutput("add_child_ui"),
            grVizOutput("xx")   )
)

server <- function(input, output){
  #Create reative value to app
  vv=reactiveValues(org=NULL,names=NULL)

  #create main tree
  observe({
    vv$org <- Node$new("Parent1")
    vv$org$AddChildNode(child = Node$new("1"))
    vv$names=vv$org$Get('name') # get names of main tree
  })

  output$add_child_ui=renderUI({
    list(
    wellPanel(
      selectInput("Name_to_change","Name_to_change",vv$names),
      textInput("new_name","new_name",""),
      actionButton("Change_name","Change_name")
    ),
    wellPanel(
      selectInput("Parent_name","Parent_name",vv$names),
      textInput("new_node_name","new_node_name",""),
      actionButton("add_child","add_child")
    ))
  })
  observeEvent(input$Change_name,{

    aa=FindNode(node=vv$org,name = input$Name_to_change) 
    aa$name=input$new_name # Change name
    vv$names=vv$org$Get('name')# get names of new tree

    #re-generate chart
    output$xx=renderGrViz({

      grViz(DiagrammeR::generate_dot(ToDiagrammeRGraph(vv$org)),engine = "dot")
    })
  })

  observeEvent(input$add_child,{

    FindNode(node=vv$org,name = input$Parent_name)$AddChildNode(Node$new(input$new_node_name)) # add child
    vv$names=vv$org$Get('name')# get names of new tree

    #re-generate chart
    output$xx=renderGrViz({

      grViz(DiagrammeR::generate_dot(ToDiagrammeRGraph(vv$org)),engine = "dot")
    })
  })

  output$xx=renderGrViz({

    grViz(DiagrammeR::generate_dot(ToDiagrammeRGraph(vv$org)),engine = "dot")
  })
}


shinyApp(ui = ui, server = server) 

答案 1 :(得分:3)

此代码不起作用,因为ToGraphViz函数已从DiagrammeR退出并替换为ToDiagrammerGraph。以下更改有效。

#  grViz(ToGraphViz(org),engine = "dot")
grViz(DiagrammeR::generate_dot(ToDiagrammeRGraph(org)))

此外,&#34;父母&#34;是一个保留字,所以我替换了它#34; parent2&#34;。