新渲染后,input $ shinyTree不会更新

时间:2019-10-22 13:25:56

标签: r shiny shinytree

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

那是故意的行为吗?每当更改shinyTree时,如何强制input$tree更新output$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。我会尝试这个。

3 个答案:

答案 0 :(得分:1)

请检查以下内容,您可以通过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)

答案 1 :(得分:0)

仅供参考,#89已解决了这个问题。

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

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

答案 2 :(得分:0)

我不建议在R 4.0.2中使用此解决方案:

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

对我来说,这引起了与此post类似的问题,我只有在重新安装R后才能解决。