R Shiny - Обновление выбора узлатоникри - PullRequest
2 голосов
/ 12 июня 2019

Приложение ниже содержит shinyTree, кнопку сброса (Reset nodes) и вывод на печать «Выбранные узлы». Вывод на печать печатает вывод функции get_selected, которая возвращает список выбранных узлов.

Вот скриншот дерева при запуске:

enter image description here

Узлы не выбраны, поэтому get_selected возвращает пустое значение list()

Когда я делаю выбор, например, узел a, get_selected правильно возвращает этот выбор:

enter image description here

Когда я нажимаю Reset nodes, выбор узлов очищается в древовидном интерфейсе, но 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");
                        }

1 Ответ

2 голосов
/ 12 июня 2019

Вы можете обновить 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...