我能够使用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)
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)