闪亮书签无法恢复selectizeinput

问题描述

我设计了一个带有两个 selectizeInput 的简单闪亮应用 (https://yuchenw.shinyapps.io/selectizeinput_bookmark/)。第二个 selectizeInput 的选择基于第一个的选择。例如,如果我在“选择一个字母”中选择“B”,“选择一个数字”的可用选项变为“B-1”、“B-2”和“B-3”。

这很好用。但是当我添加书签按钮时,我无法恢复第二个 selectizeInput,只能恢复第一个。例如,如果我如下选择“B”和“B-3”,然后点击“书签”按钮,我得到一个网址(https://yuchenw.shinyapps.io/selectizeinput_bookmark/?_inputs_&sidebarCollapsed=false&Example=%22Page%22&sidebarItemExpanded=null&_values_&Number_Select=%22B-3%22&Letter_Select=%22B%22)。

enter image description here

当我将 URL 复制并粘贴到网络浏览器时,第一个是“B”,但第二个是“B-1”。

enter image description here

我认为这与我的 updateSelectizeInput 的设置有关,但我不知道如何解决。完整代码如下。

library(shiny)
library(shinydashboard)

dat <- data.frame(
  Letter = rep(c("A","B","C"),each = 3),Number = paste(rep(c("A",rep(1:3,times = 3),sep = "-")
)

ui <- function(request){
  dashboardPage(
    header = dashboardHeader(title = ""),sidebar = dashboardSidebar(
      sidebarMenu(
        id = "Example",menuItem(
          text = "Page",tabName = "Page"
          )),bookmarkButton()),body = dashboardBody(
      tabItems(
        tabItem(
        tabName = "Page",h2("SelectizeInput Bookmark Example"),fluidRow(
          Box(
            title = "",status = "primary",solidHeader = TRUE,width = 6,collapsible = TRUE,selectizeInput(inputId = "Letter_Select",label = "Select a letter",choices = c("A",options = list(
                             placeholder = 'Please select a letter below',onInitialize = I('function() { this.setValue(""); }'),create = TRUE)
            ),selectizeInput(inputId = "Number_Select",label = "Select a number",choices = paste(rep(c("A",sep = "-"),options = list(
                             placeholder = 'Please select a number below',create = TRUE)
            )
          )
        )
        )
      )
    )
  )
}

server <- function(input,output,session){
  
  observeEvent(c(input$Letter_Select),{
    updateSelectizeInput(session,inputId = "Number_Select",choices = dat$Number[dat$Letter %in% input$Letter_Select],server = TRUE)
  },ignoreInit = TRUE)
  
  # List of selectizeinput
  selectize_inputs <- c("Letter_Select","Number_Select")
  
  setBookmarkExclude(names = selectize_inputs)
  
  onBookmark(function(state){
    for (selectize_input in selectize_inputs){
      state$values[[selectize_input]] <- isolate({input[[selectize_input]]})
    }
  })
  
  onRestore(function(state){
    updateSelectizeInput(session,inputId = "Letter_Select",selected = state$values[["Letter_Select"]],server = TRUE)
    updateSelectizeInput(session,choices = dat$Number[dat$Letter %in% state$values[["Letter_Select"]]],selected = state$values[["Number_Select"]],server = TRUE)
    
  })
}

shinyApp(ui,server,enableBookmarking = "url")

请注意,我必须将 server = TRUE 用于 selectizeInput,因为我的实际应用程序有许多需要显示的选项。我还需要使用 shinydashboardenableBookmarking = "url。请告诉我您的想法。

解决方法

这是由于 observeEvent(c(input$Letter_Select),...) 在完成 onRestore 后触发并重置对 Number_select 所做的更改。

您可以在恢复状态后使用 reactiveVal 来避免这种重置:

server <- function(input,output,session){
  
  restoreState <- reactiveVal(F)
  
  observeEvent(c(input$Letter_Select),{
    if (!restoreState()){    
      updateSelectizeInput(session,inputId = "Number_Select",label = "Select a number",choices = dat$Number[dat$Letter %in% input$Letter_Select],server = TRUE)
    }
    restoreState(F)
  },ignoreInit = TRUE)
  
  # List of selectizeinput
  selectize_inputs <- c("Letter_Select","Number_Select")
  
  setBookmarkExclude(names = selectize_inputs)
  
  onBookmark(function(state){
    for (selectize_input in selectize_inputs){
      state$values[[selectize_input]] <- isolate({input[[selectize_input]]})
    }
  })
  
  onRestore(function(state){
    updateSelectizeInput(session,inputId = "Letter_Select",choices = c("A","B","C"),selected = state$values[["Letter_Select"]],server = TRUE)

    updateSelectizeInput(session,choices = dat$Number[dat$Letter %in% state$values[["Letter_Select"]]],selected = state$values[["Number_Select"]],server = TRUE)
    restoreState(T)
  })
}

shinyApp(ui,server,enableBookmarking = "url")

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...