【问题标题】:Shiny: Issues with conditional update of SelectizeInput choicesShiny:SelectizeInput 选项的条件更新问题
【发布时间】:2017-11-30 09:51:58
【问题描述】:

我想选择一个对输出有影响的选项。这里有两个选项:汽车,气缸可供选择。根据选择的选项,他们有不同的选择。

library(shiny)

mtcars$cars <- rownames(mtcars)

ui <- fluidPage(
  title = 'Select experiment',
  sidebarLayout(
    sidebarPanel(
      radioButtons("selectOpt", "Want to select:",
                   list("Car"='car', "Cylinders"='cyl'),
                   selected = 'car'),

      conditionalPanel(
        condition = "input.selectOpt=='car'",
        selectizeInput(
          inputId = "sel_car", 
          label = "Select a Car",
          choices = mtcars$cars
        )),
      conditionalPanel(
        condition = "input.selectOpt=='cyl'",
        selectizeInput(
          inputId = "sel_cyl", 
          label = "Select Cylinders",
          choices = unique(mtcars$cyl)
        )
        )
    ),
    mainPanel(
      helpText('Output of the examples in the left:'),
      verbatimTextOutput('ex_out')
    )
  )
)

server <- function(input, output) {

    output$ex_out <- renderPrint({
      if(!is.null(input$sel_car)){
        cat(input$sel_car,input$sel_cyl,'\n')
        mtcars[mtcars$cars == input$sel_car,]
      }else if(!is.null(input$sel_cyl)){
        mtcars[mtcars$cyl == input$sel_cyl,]
      }
    })
}

shinyApp(ui, server)

但是,我观察到这两个选项总是选择一个选项。这可以在输出的第一行中观察到(来源cat(input$sel_car,input$sel_cyl,'\n'))。

Car被选中时,Cylinders option中的第一个选项6也被选中。

选择选项,汽车选项 MAZDA RX4 EM>的首选也被选中。

如何避免第一个选项的默认选择,以便我能够同时评估 ifelse if 部分?

【问题讨论】:

    标签: r shiny shinydashboard


    【解决方案1】:

    单选select(ize)Input() 总是有一个选定的选项。 来自?selectInput

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

    要获得您需要的功能,我们可以插入一种“无效”选择:

    selectizeInput(
      inputId = "sel_car", 
      label = "Select a Car",
      choices = c('No car' = 0, mtcars$cars)
    )
    

    并在if.. else 中检查:

    if(input$sel_car != 0){
      cat(input$sel_car,input$sel_cyl,'\n')
      mtcars[mtcars$cars == input$sel_car,]
    }
    

    完整代码:

    library(shiny)
    
    mtcars$cars <- rownames(mtcars)
    
    ui <- fluidPage(
      title = 'Select experiment',
      sidebarLayout(
        sidebarPanel(
          radioButtons("selectOpt", "Want to select:",
                       list("Car"='car', "Cylinders"='cyl'),
                       selected = 'car'),
    
          conditionalPanel(
            condition = "input.selectOpt=='car'",
            selectizeInput(
              inputId = "sel_car", 
              label = "Select a Car",
              choices = c('No car' = 0, mtcars$cars)
            )),
          conditionalPanel(
            condition = "input.selectOpt=='cyl'",
            selectizeInput(
              inputId = "sel_cyl", 
              label = "Select Cylinders",
              choices = c('No cylinder selected' = 0, unique(mtcars$cyl)),
              selected = NA
            )
          )
        ),
        mainPanel(
          helpText('Output of the examples in the left:'),
          verbatimTextOutput('ex_out')
        )
      )
    )
    
    server <- function(input, output) {
    
      output$ex_out <- renderPrint({
        cat(input$sel_car)
        if(input$sel_car != 0){
          cat(input$sel_car,input$sel_cyl,'\n')
          mtcars[mtcars$cars == input$sel_car,]
        }else if(input$sel_cyl != 0){
          mtcars[mtcars$cyl == input$sel_cyl,]
        }
      })
    }
    
    shinyApp(ui, server)
    

    【讨论】:

    • 感谢您的解决方案。我观察到该应用程序的奇怪行为。如果在 Car 选项中选择一个选项后在 Cylinders 选项中选择一个选项,则显示的输出与预期不符(具有所选气缸数的行)。但是如果我刷新应用程序并直接选择 Cylinders 选项中的选项,它就可以正常工作。这种行为的解决方法是什么?
    • 这种行为是意料之中的。 conditionalPanel 只是隐藏了输入,但选定的值仍然存在。如果你想要两个独占的Inputs,你可能想看看updateSelectInput() 函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 2020-04-06
    • 2022-06-28
    • 2022-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多