【问题标题】:Why selectizeInput does not select the first choices when server = FALSE?为什么当 server = FALSE 时 selectizeInput 不选择第一个选项?
【发布时间】:2021-07-09 10:15:36
【问题描述】:

selectizeInput 的文档描述了 selected 的参数如下。

selected 最初选择的值(或多个值,如果有多个 =真)。如果未指定,则默认为单选列表的第一个值,而多选列表则没有值。

如果没有为selected 指定任何内容,我将这句话解释为selected 参数将是choices 参数的第一个元素。但是,在以下示例中,在为第一个 selectizeInput 选择任何数字后,第二个 selectizeInput 不会选择第一个选项。它仍将默认消息显示为占位符。

请注意,如果我设置server = TRUE,第二个selectizeInput 将能够将第一个选项显示为selected

我想知道为什么server = TRUEserver = FALSE 会影响selected 是否可以成为choices 中的第一个元素。我也想知道如何使server = FALSE 的行为与server = TRUE 的行为相同。

library(shiny)

ui <- fluidPage(
  headerPanel("shinyStore Example"),
  sidebarLayout(
    sidebarPanel = sidebarPanel(
      selectizeInput(inputId = "Select1", label = "Select A Number",
                     choices = as.character(1:3),
                     options = list(
                       placeholder = 'Please select a number',
                       onInitialize = I('function() { this.setValue(""); }'),
                       create = TRUE
                     ))
    ),
    mainPanel = mainPanel(
      fluidRow(
        selectizeInput(inputId = "Select2", 
                       label = "Select A Letter",
                       choices = character(0),
                       options = list(
                         placeholder = 'Please select a number in the sidebar first',
                         onInitialize = I('function() { this.setValue(""); }'),
                         create = TRUE
                       ))
      )
    )
  )
)

server <- function(input, output, session) {
  
  dat <- data.frame(
    Number = as.character(rep(1:3, each = 3)),
    Letter = letters[1:9]
  )
  
  observeEvent(input$Select1, {
    updateSelectizeInput(session, inputId = "Select2", 
                         choices = dat$Letter[dat$Number %in% input$Select1],
                         server = FALSE)
  })
}

shinyApp(ui, server)

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    为什么不在服务器端完全创建第二个selectizeInput

    library(shiny)
    
    ui <- fluidPage(
      headerPanel("shinyStore Example"),
      sidebarLayout(
        sidebarPanel = sidebarPanel(
          selectizeInput(inputId = "Select1", label = "Select A Number",
                         choices = as.character(1:3),
                         options = list(
                           placeholder = 'Please select a number',
                           onInitialize = I('function() { this.setValue(""); }'),
                           create = TRUE
                         ))
        ),
        mainPanel = mainPanel(
          fluidRow(
            uiOutput('select2')
          )
        )
      )
    )
    
    server <- function(input, output, session) {
      
      dat <- data.frame(
        Number = as.character(rep(1:3, each = 3)),
        Letter = letters[1:9]
      )
      
      output$select2 <- renderUI({
          req(input$Select1)
          selectizeInput(inputId = "Select2", 
                         label = "Select A Letter",
                         choices = dat$Letter[dat$Number %in% input$Select1])
    
      })
    }
    
    shinyApp(ui, server)
    

    【讨论】:

    • 感谢您的精彩回答。我赞成它。你知道为什么selectizeInput 需要在服务器端吗?
    • 在这种情况下没有什么特别的,但总的来说,我在shiny 中使用update 函数时遇到了很多问题。现在,我只是避免使用update 函数,而几乎总是使用renderUIuiOutput。我可能遗漏了一些关于更新功能的基本知识,但使用 renderUI 对我有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    相关资源
    最近更新 更多