在下面的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
。我会尝试这个。
答案 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后才能解决。