R闪亮-重置发光树节点选择

R闪亮-重置发光树节点选择,r,shiny,shinytree,R,Shiny,Shinytree,下面的应用程序包含一个shinyTree、一个重置按钮(reset nodes)和一个打印输出“Selected nodes”。打印输出打印get_selected函数的输出,该函数返回选定节点的列表 以下是启动树的屏幕截图: 未选择任何节点,因此get\u selected返回一个空的列表() 当我进行选择时,例如节点a,get_selected会正确返回该选择: 当我单击“重置节点”时,节点选择在树UI中被清除,但“获取选定的节点”与上一个选择没有变化: 单击重置按钮时,观察者通过up

下面的应用程序包含一个
shinyTree
、一个重置按钮(
reset nodes
)和一个打印输出“Selected nodes”。打印输出打印
get_selected
函数的输出,该函数返回选定节点的列表

以下是启动树的屏幕截图:

未选择任何节点,因此
get\u selected
返回一个空的
列表()

当我进行选择时,例如节点
a
get_selected
会正确返回该选择:

当我单击“重置节点”
时,节点选择在树UI中被清除,但“获取选定的节点”与上一个选择没有变化:

单击重置按钮时,观察者通过
updateTree
更新树,如下所示:

observeEvent(input$reset, {

    updateTree(session,"tree", data = tree)
  })
我想
get_selected
在我点击reset时返回
list()
。我是否错误地使用了
updateTree

以下是重现上述内容的代码:

library(shiny)
library(shinyTree)

tree = structure(list(a=list(a1=1,a2=2) , b="b"), stopened = T) 

tree = lapply(tree, function(x) structure(x, stopened = T))

ui <- fluidPage(
  tags$head(tags$script('
                        $("#reset").onlick(function() {
                        $("#tree").jstree("deselect_all");
                        }
                        ')),
  fluidPage(
    sidebarLayout(
      sidebarPanel(
        actionButton('reset', 'Reset nodes')
      ),
      mainPanel(
        shinyTree("tree", ),
        hr(),
        "Selected nodes:",
        verbatimTextOutput("idSelected")#,
      )
    )
  )
)

# server

server <- function(input, output, session) {

  output$tree = renderTree({

    tree

  })


  output$idSelected <- renderPrint({
    str(get_selected(input$tree, format = "classid"))
  })


  # An observer is used to trigger a tree update when reset is clicked.
  observeEvent(input$reset, {

    updateTree(session,"tree", data = tree)

    print(get_selected(input$tree, format = "classid"))
  })
}

shinyApp(ui, server)

您可以在点击重置按钮时更新
reactiveVal
,而不是直接参考
get_selected
提供的数据:

library(shiny)
library(shinyTree)

tree <- lapply(structure(list(a=list(a1=1,a2=2) , b="b"), stopened = TRUE) , function(x) structure(x, stopened = TRUE))

ui <- fluidPage(
  fluidPage(
    sidebarLayout(
      sidebarPanel(
        actionButton('reset', 'Reset nodes')
      ),
      mainPanel(
        shinyTree("tree", ),
        hr(),
        "Selected nodes:",
        verbatimTextOutput("idSelected")#,
      )
    )
  )
)

server <- function(input, output, session) {

  treeSelection <- reactiveVal(list())

  output$tree = renderTree({
    tree
  })

  observeEvent(input$reset, {
    updateTree(session, "tree", data = tree)
    treeSelection(list())
  })

  observeEvent(input$tree, {
    treeSelection(get_selected(input$tree, format = "classid"))
  })

  output$idSelected <- renderPrint({
    treeSelection()
  })

}

shinyApp(ui, server)
库(闪亮)
图书馆(银树)

树谢谢你@Ismirsehegal!你知道为什么
get\u selected
没有改变吗?我是否错误地使用了
updateTree
?您是否正确地使用了
updateTree
。我对
library(shinyTree)
不太熟悉,但更新/重新呈现树似乎不会触发设计所选节点的更新。shinyTree contributor:人们通常不希望在调用更新树时回调,因为他们已经知道树中的内容。当然,输入$tree不会在调用updateTree后立即更新;您仍然需要在观察中获取新的输入$tree。@ismirsehregal的答案是您特定问题的优雅解决方案。by现在为我们提供了设置
选项(shinyTree.refresh=TRUE)
以获得所需行为的可能性-请参阅
library(shiny)
library(shinyTree)

tree <- lapply(structure(list(a=list(a1=1,a2=2) , b="b"), stopened = TRUE) , function(x) structure(x, stopened = TRUE))

ui <- fluidPage(
  fluidPage(
    sidebarLayout(
      sidebarPanel(
        actionButton('reset', 'Reset nodes')
      ),
      mainPanel(
        shinyTree("tree", ),
        hr(),
        "Selected nodes:",
        verbatimTextOutput("idSelected")#,
      )
    )
  )
)

server <- function(input, output, session) {

  treeSelection <- reactiveVal(list())

  output$tree = renderTree({
    tree
  })

  observeEvent(input$reset, {
    updateTree(session, "tree", data = tree)
    treeSelection(list())
  })

  observeEvent(input$tree, {
    treeSelection(get_selected(input$tree, format = "classid"))
  })

  output$idSelected <- renderPrint({
    treeSelection()
  })

}

shinyApp(ui, server)