【问题标题】:R Shiny - Resetting shinyTree node selectionsR Shiny - 重置闪亮树节点选择
【发布时间】:2019-06-12 05:36:33
【问题描述】:

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

这是启动时树的屏幕截图:

没有选择节点,所以get_selected 返回一个空的list()

当我做出选择时,例如节点aget_selected 正确返回该选择:

当我单击 Reset nodes 时,树形 UI 中的节点选择被清除,但 get_selected 与之前的选择相比没有变化:

当点击重置按钮时,观察者通过updateTree更新树如下:

observeEvent(input$reset, {

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

我希望get_selected 在我点击重置时返回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)

我尝试了以下 JQuery 无济于事:

$("#reset").onlick(function() {
                        $("#tree").jstree("deselect_all");
                        }

【问题讨论】:

  • 现在PR 89 为我们提供了设置options(shinyTree.refresh = TRUE) 以获得所需行为的可能性 - 请参阅this

标签: r shiny shinytree


【解决方案1】:

您可以在点击重置按钮时更新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)

【讨论】:

  • 谢谢@ismirsehregal!你知道为什么get_selected 没有改变吗?我是否错误地使用了updateTree
  • 您正确使用了updateTree。我对library(shinyTree) 不是很熟悉,但似乎更新/重新渲染树并不会按设计触发所选节点的更新。
  • shinyTree 贡献者在这里:人们通常不希望在调用更新树时回调,因为他们已经知道树中的内容。当然,在调用 updateTree 之后 input$tree 不会立即更新;您仍然需要在观察中获取新的 input$tree。 @ismirsehregal 的答案是针对您的特定问题的优雅解决方案
猜你喜欢
  • 2019-06-14
  • 2018-04-17
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 2016-03-16
  • 2017-08-08
  • 1970-01-01
  • 2020-08-01
相关资源
最近更新 更多