【问题标题】:Shiny if statement with prettyRadioButtons & checkboxGroupInput带有 prettyRadioButtons 和 checkboxGroupInput 的闪亮 if 语句
【发布时间】:2020-06-20 03:00:26
【问题描述】:

我的 ShinyApp 需要两组复选框(下面我的代码中的 check1 和 check2)。该应用程序将根据用户的选择填充不同的下拉菜单。

但是,if else 语句似乎与prettyRadioButtons 一起工作正常,但是当我将它应用于checkboxGroupInput 时它不起作用。我的应用程序的简化版本如下所示。我的if 声明中是否遗漏了什么?提前致谢!

ui <- fluidPage(
  titlePanel("Dynamic Boxes"),
  fluidRow(
    prettyRadioButtons("check1", "Please Pick", c("Option 1" = "op1", "Option 2" = "op2"), selected=character(0), shape="square", outline = T, inline = T),
    checkboxGroupInput("check2", "Please Pick", c("Option 3" = "op3", "Option 4" = "op4"), inline = T),

    fluidRow(hidden(selectInput('select_1', 'No.1 Select',choices = list1))),
    fluidRow(hidden(selectInput('select_2', 'No.2 Select',choices = list2))),
    fluidRow(hidden(selectInput('select_3', 'No.3 Select',choices = list3))),
    fluidRow(hidden(selectInput('select_4', 'No.4 Select',choices = list4))),
    fluidRow(hidden(selectInput('select_5', 'No.5 Select',choices = list5)))
  )
)


server <- function(input, output){
  observeEvent(input$check1, {
    if(!is.null(input$check1)){
      if(input$check1 == 'op1'){
        showElement('select_1')
      }
      else if(input$check1 == 'op2'){
        if(length(input$check2) == 1){
          if(input$check2 == 'op3'){showElement('select_2')}
          else if(input$check2 == 'op4'){showElement('select_3')}
        } 
        else if(length(input$check2) == 2){showElement('select_4')}
      }
    }
  })

}

【问题讨论】:

标签: r shiny shinydashboard shinyapps shiny-reactivity


【解决方案1】:

下面使用renderUI 实现selectInput 的if-else 逻辑: 1) 只要没有选择任何单选按钮,它就不会显示任何内容; 2) 如果选择了按钮 1(“选项 1”),它会在 list1 中显示选项; 3) 如果选择了按钮 2(“选项 2”),只要没有勾选任何复选框,它就不会显示任何内容,如果只勾选了复选框 1(“选项 3”),则在 list2 中显示选项,list3 中的选项如果只勾选了复选框 2(“选项 4”),如果两个复选框都勾选了,则 list4 中的选项。在list5 中的示例代码选项中将永远不会被渲染,所以我很难说出你想把它放在哪里,我已经忽略了它。

library(shiny)
library(shinyWidgets)

list1 = letters[1:3]
list2 = letters[4:6]
list3 = letters[7:9]
list4 = letters[10:12]

ui <- fluidPage(
  titlePanel("Dynamic Boxes"),
  fluidRow(
    prettyRadioButtons("check1", "Please Pick", c("Option 1" = "op1", "Option 2" = "op2"), selected=character(0), shape="square", outline = T, inline = T),
    checkboxGroupInput("check2", "Please Pick", c("Option 3" = "op3", "Option 4" = "op4"), inline = T),
    uiOutput("select")
  )
)


server <- function(input, output){

  output$select = renderUI({

    req(input$check1) 

    if (input$check1 == 'op1') {
      selectInput('select_1', 'No.1 Select',choices = list1)
    } 
    else if (input$check1 == 'op2') {
      req(input$check2)
      if (length(input$check2) == 1) {
        if(input$check2 == 'op3') {
          selectInput('select_2', 'No.2 Select',choices = list2)
        }
        else if (input$check2 == 'op4') {
          selectInput('select_3', 'No.3 Select',choices = list3)
        }
      } 
      else if(length(input$check2) == 2){
        selectInput('select_4', 'No.4 Select',choices = list4)
      }
    }
  })

}

shinyApp(ui, server)

我认为单选按钮和复选框的组合可能有点复杂,因为例如基于显示列表 4 的标签,实际上是选项 2-4 的组合。您可能有充分的理由选择这种设计,在这种情况下很棒!但如果不是这样,那么也许像下面这样稍微修改的设计会让用户(和你自己!)的事情变得更容易。

# Continuing from above ----
ui <- fluidPage(
  titlePanel("Dynamic Boxes"),
  fluidRow(
    prettyRadioButtons("check1", "Please Pick", c("Option 1" = "op1", "Option 2" = "op2"), selected=character(0), shape="square", outline = T, inline = T),
    uiOutput("check2"),
    uiOutput("select")
  )
)


server <- function(input, output) {

  output$check2 = renderUI({
    req(input$check1)
    if (input$check1=='op2') {
      prettyRadioButtons("check2", "Please Pick", 
                         c("Option 2.1" = "op3", "Option 2.2" = "op4", "Option 2.3" = "op5"), 
                         selected=character(0), shape="square", outline = T, inline = T)
    }
  })

  output$select = renderUI({
    req(input$check1) 
    if (input$check1 == 'op1') {
      selectInput('select_1', 'No.1 Select',choices = list1)
    } 
    else if (input$check1 == 'op2') {
      req(input$check2)
      if (input$check2 == 'op3') {
        selectInput('select_2', 'No.2 Select',choices = list2)
      } else if (input$check2== 'op4') {
        selectInput('select_3', 'No.3 Select',choices = list3)
      } else {
        selectInput('select_4', 'No.4 Select',choices = list4)
      }
    }
  })

}

shinyApp(ui, server)

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多