简体   繁体   English

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

[英]Tree plot displays in R, but not in R-Shiny

I am able to use the data.tree package to produce a plot. 我可以使用data.tree包来生成一个图。 Here is an example of a plot: 这是一个情节的例子:

library(data.tree)

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

plot(org)

However, I am not able to render this plot in R-Shiny. 但是,我无法在R-Shiny中渲染这个情节。 I have been able to render most other plots in Shiny. 我已经能够渲染Shiny中的大多数其他情节。 What can I do to render this plot, and why is it not showing up? 我该怎么做才能渲染这个情节,为什么它没有出现? Here is my Shiny code: 这是我的闪亮代码:

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)         

plot(org) generate widget of class grViz So you can use renderGrViz to show plot in shiny. plot(org)生成类grViz小部件所以你可以使用renderGrViz来显示闪亮的情节。

Like ( textInput used for example of change name of "parent") 喜欢( 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) 

Update add node dynamically 动态更新添加节点

If You want to add nodes dynamically you can try to add child to node by name( you need some checks to avoid names duplicate) 如果要动态添加节点,可以尝试按名称将子节点添加到节点(需要进行一些检查以避免名称重复)

New functions to draw chart get from @rpm answer 绘制图表的新功能来自@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) 

This code does not work as the ToGraphViz function has been retired from DiagrammeR and replaced with ToDiagrammerGraph. 此代码不起作用,因为ToGraphViz函数已从DiagrammeR退出并替换为ToDiagrammerGraph。 The following change works. 以下更改有效。

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

Also, "parent" is a reserved word so I replaced it "parent2". 另外,“父”是保留字,所以我将其替换为“parent2”。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM