2

在下面的shiny应用程序中,我有一个重置按钮,它可以重置shinyTree. 我发现按下reset后对应的input$tree没有更新,即input$tree仍然反映了un-reset状态。通过移动一些节点来尝试应用程序并按下重置按钮,您会看到,当输出被重置时,verbatimTextOutput仍然显示旧版本。

这种行为是故意的吗?如何强制shinyTree更新input$treeoutput$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)

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

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

我对闪亮的输入小部件只有肤浅的了解,但我想#89可以解决我的问题,因为shiny 只要有refresh. 我会试试这个。

4

3 回答 3

1

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

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)
于 2019-10-23T07:20:34.550 回答
0

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

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

对我来说,它引起了类似于这篇文章的问题,我只能在重新安装 R 后才能解决。

于 2020-07-17T14:20:03.370 回答
0

仅供参考,正如已经假设的那样,#89解决了这个问题。

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

背后的原因是shinyTree作者决定不回调刷新(或setState所有重要的)因此input$tree不“知道”它已更改并返回过时的树。新的 PR 允许在刷新时显式回调(通过设置选项),这解决了我的问题。

于 2019-10-23T07:39:45.490 回答