我可以使用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)
答案 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;。