如何在恢复时保留 selectInput 变量的顺序?

How to preserve order of selectInput variables on restore?

我注意到从书签恢复应用程序时,选择输入选项的排序方式不正确。我发现这是一个known issue。但是,我正在尝试找到解决此问题的方法。例如,在下面的屏幕截图中,我按顺序输入了 8、7、6、5、4、3、2 和 1。但是在恢复它时,顺序默认为 1、2、3、4、5、6、7 , 8.

截图

代码

library(shiny)

ui <- function(request) {
  fluidPage(
    verticalLayout( 
      div(style = "height: 20vh"), 
      div(style = "height: 40vh;", 
          htmlOutput("text", style = "text-align: center;")
          ),
      div(style = "display: flex; justify-content: center;",
          div(style = "display: inline-block; vertical-align: top;",
              selectInput("vars",
                  "Select variables",
                  multiple = TRUE,
                  choices = c(1, 2, 3, 4, 5, 6, 7, 8)),
              bookmarkButton())
      )))
}

server <- function(input, output) {
 
    output$text <- renderText({
      paste0("<p>", input$vars, "</p>")
    })
}

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

如果您阅读 Advanced bookmarking,它暗示可以使用 onRestored 覆盖正常行为。两个更改:将 session 添加到您的服务器组件,并添加一个 onRestored() 块。

library(shiny)
ui <- function(request) {
  fluidPage(
    verticalLayout(
      div(style = "height: 20vh"),
      div(style = "height: 40vh;",
          htmlOutput("text", style = "text-align: center;")
          ),
      div(style = "display: flex; justify-content: center;",
          div(style = "display: inline-block; vertical-align: top;",
              selectInput("vars",
                  "Select variables",
                  multiple = TRUE,
                  choices = c(1, 2, 3, 4, 5, 6, 7, 8)),
              bookmarkButton())
      )))
}

server <- function(input, output, session) {
  onRestored(function(state) {
    updateSelectInput(session, "vars", selected = state$input$vars)
  })
  output$text <- renderText({
    paste0("<p>", input$vars, "</p>")
  })
}

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

(我还用 onRestore 测试了这个(没有尾随 d),它也在那里工作。文档明确建议使用 onRestored 调用 update*功能,所以我会在不知道确切原因的情况下使用它。)