input$shinyTree 在新渲染后没有得到更新

input$shinyTree does not get updated after new render

在下面的 shiny 应用程序中,我有一个重置按钮,可以重置 shinyTree。我认为相应的 input$tree 在按下重置后 不会 得到更新,即 input$tree 仍然反映未重置状态。通过移动一些节点并按下重置按钮来试用该应用程序,您会看到虽然输出被重置,但 verbatimTextOutput 仍然显示旧版本。

这种行为是故意的吗?每当 output$tree 发生变化时,如何强制 shinyTree 更新 input$tree#89 能解决我的问题吗?

library(shiny)
library(shinyTree)

ui <- fluidPage(actionButton("reset", "reset"),
                shinyTree("tree", dragAndDrop=TRUE, sort = F, wholerow = T, unique = T),
                verbatimTextOutput("str"))



server <- function(input, output, session) {
  output$tree <- renderTree({
    input$reset
    list(
      root3 = "234",
      root1 = list(
        SubListA = list(leaf1 = "", leaf2 = "")
      ),
      root2 = list(
        SubListA = list(leaf1 = "", leaf2 = "")
      )
    )
  })

  output$str <- renderPrint({
    # shinyTrees will also be available as inputs so you can
    # monitor changes that occur to the tree as the user interacts
    # with it.
    str(input$tree)
  })
}

shinyApp(ui, server)

澄清一下:我在发布这个问题之前已经阅读了 ,虽然相关,但它并没有解决我的问题,因为我一开始并没有在实际使用中使用 updateTree情况要复杂得多。因此,使用额外 reactiveVal 的突出显示解决方案将无法顺利运行。

我真的需要一个解决方案来确保 input$tree 是最新的,无论树是通过用户交互还是通过 R 代码本身更新。

我对闪亮的输入小部件只有肤浅的了解,但我想 #89 可以解决我的问题,因为它会在有 [=24= 时将一棵新树传递给 shiny ].我会试试这个。

请检查以下内容,您可以通过 JS 强制重置 input$tree

library(shiny)
library(shinyTree)
library(shinyjs)

ui <- fluidPage(
  useShinyjs(),
  actionButton("reset", "reset"),
                shinyTree("tree", dragAndDrop=TRUE, sort = F, wholerow = T, unique = T),
                verbatimTextOutput("str"))

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

  observeEvent(input$reset, {
    runjs("Shiny.setInputValue('tree', null);")
  })

  output$tree <- renderTree({
    input$reset
    list(
      root3 = "234",
      root1 = list(
        SubListA = list(leaf1 = "", leaf2 = "")
      ),
      root2 = list(
        SubListA = list(leaf1 = "", leaf2 = "")
      )
    )
  })

  output$str <- renderPrint({
    str(input$tree)
  })
}

shinyApp(ui, server)

仅供参考,如前所述,#89 解决了这个问题。

devtools::install_github("shinyTree/shinyTree#89")
options(shinyTree.refresh = TRUE)

背后的原因是 shinyTree 作者决定不在刷新时回调(或者 setState 所有重要的事情)因此 input$tree 不 "know" 它是改变了 returns 陈旧的树。新的 PR 允许在刷新时显式回调(通过设置选项),这解决了我的问题。

我不会在 R 4.0.2 中推荐这个解决方案:

devtools::install_github("shinyTree/shinyTree#89")
options(shinyTree.refresh = TRUE)

对我来说,它导致了与此类似的问题post,我只能在重新安装 R 后才能解决。