R Shiny - 重置 Shiny 树节点选择

标签 r shiny shinytree

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

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

enter image description here

未选择任何节点,因此 get_selected 返回空的 list()

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

enter image description here

当我单击重置节点时,树 UI 中的节点选择将被清除,但 get_selected 不会更改之前的选择:

enter image description here

当点击重置按钮时,观察者通过 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");
                        }

最佳答案

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

关于R Shiny - 重置 Shiny 树节点选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56555281/

相关文章:

r - 只有组中差异小于 'n' 的行

javascript - Shiny 的 HTML UI 受 Javascript OnLoad 限制?

r - 从组 dplyr 构造字符串

r - R 中的选择性数据集成

r - 根据另一个变量在 R 中按组创建日期序列

java - 通过 Java 从终端运行 R

R Shiny 的 widgetFunc() 警告消息,带有 eventReactive(警告 1) 和 renderDataTable (警告 2)

R Shiny DataTable如何防止包含超链接的列中的行选择/取消选择

javascript - 添加元素后触发 JavaScript 代码