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

Pau*_*ger 3 r shiny

我能够使用data.tree包来生成一个图。这是一个情节的例子:

library(data.tree)

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

plot(org)
Run Code Online (Sandbox Code Playgroud)

但是,我无法在 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)         
Run Code Online (Sandbox Code Playgroud)

Bat*_*hek 5

plot(org)生成类的小部件grViz因此您可以使用renderGrViz闪亮的方式显示绘图。

喜欢(textInput用于更改“父级”名称的示例)

  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) 
Run Code Online (Sandbox Code Playgroud)

动态更新添加节点

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

绘制图表的新函数来自@rpm 答案

 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) 
Run Code Online (Sandbox Code Playgroud)