首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >闪亮的书签无法恢复选择输入

闪亮的书签无法恢复选择输入
EN

Stack Overflow用户
提问于 2021-05-26 15:26:44
回答 1查看 202关注 0票数 4

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

这个效果很好。但是当我添加一个书签按钮时,我不能恢复第二个selectizeInput,只有第一个。例如,如果按下面的方式选择"B“和"B-3”,然后单击"Bookmark“按钮,就会得到一个URL (https://yuchenw.shinyapps.io/selectizeinput_bookmark/?_inputs_&sidebarCollapsed=false&Example=%22Page%22&sidebarItemExpanded=null&_values_&Number_Select=%22B-3%22&Letter_Select=%22B%22)。

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

我认为这与我的updateSelectizeInput的设置有关,但我不知道如何修复它。下面是完整的代码。

代码语言:javascript
运行
复制
library(shiny)
library(shinydashboard)

dat <- data.frame(
  Letter = rep(c("A", "B", "C"), each = 3),
  Number = paste(rep(c("A", "B", "C"), each = 3),
                 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", "B", "C"),
                           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", "B", "C"), each = 3),
                                           rep(1:3, times = 3),
                                           sep = "-"),
                           options = list(
                             placeholder = 'Please select a number below',
                             onInitialize = I('function() { this.setValue(""); }'),
                             create = TRUE)
            )
          )
        )
        )
      )
    )
  )
}

server <- function(input, output, session){
  
  observeEvent(c(input$Letter_Select), {
    updateSelectizeInput(session, inputId = "Number_Select", 
                         label = "Select a number",
                         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", 
                         choices = c("A", "B", "C"),
                         selected = state$values[["Letter_Select"]],
                         server = TRUE)
    updateSelectizeInput(session, inputId = "Number_Select", 
                         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。请告诉我你的想法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-28 20:10:28

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

在还原状态后,可以使用reactiveVal来避免这种重置:

代码语言:javascript
运行
复制
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, inputId = "Number_Select", 
                         choices = dat$Number[dat$Letter %in% state$values[["Letter_Select"]]],
                         selected = state$values[["Number_Select"]],
                         server = TRUE)
    restoreState(T)
  })
}

shinyApp(ui, server, enableBookmarking = "url")
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67708041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档