R 闪亮:SelectizeInput选项的条件更新问题

R 闪亮:SelectizeInput选项的条件更新问题,r,shiny,shinydashboard,R,Shiny,Shinydashboard,我想选择一个对输出有影响的选项。这里有两种选择:汽车、气缸可供选择。根据所选选项,他们有不同的选择 library(shiny) mtcars$cars <- rownames(mtcars) ui <- fluidPage( title = 'Select experiment', sidebarLayout( sidebarPanel( radioButtons("selectOpt", "Want to select:",

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

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)
然而,我观察到这两个选项总是有一个选项被选中。这可以在outputsource catinput$sel_car,input$sel_cyl,'\n'的第一行中观察到

当选择Car时,气缸选项6中的第一个选项也被选中。

当气缸选项被选中时,车内首选选项马自达RX4也被选中。

如何避免第一个选项的默认选择,以便我能够同时计算if和else if部分?

单选selectizeInput始终有一个选中的选项。 从?选择输入:

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

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

selectizeInput(
  inputId = "sel_car", 
  label = "Select a Car",
  choices = c('No car' = 0, mtcars$cars)
)
并在if中检查。。其他:

完整代码:

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)

谢谢你的解决方案。我观察到该应用程序有一种奇怪的行为。如果我在选择了choice in Car选项后选择了choice in Cylins选项,则显示的输出与预期的不一样,即具有所选气缸数的Rows。但是,如果我刷新应用程序并直接选择“在圆柱体中选择”选项,它就可以正常工作。这种行为的解决方法是什么?这种行为是预期的。conditionalPanel只是隐藏输入,但选定的值仍然存在。如果需要两个独占输入,可能需要查看updateSelectInput函数。
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)