带有 prettyRadioButtons 和 checkboxGroupInput 的闪亮 if 语句
Shiny if statement with prettyRadioButtons & checkboxGroupInput
我的 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')}
}
}
})
}
下面使用 renderUI
实现了 selectInput
的 if-else 逻辑: 1) 只要选择了单选按钮的 none,它就什么都不显示; 2) 如果选择按钮 1 ("Option 1"),它会在 list1
中显示选项; 3) 如果选择了按钮 2 ("Option 2"),只要复选框的 none 被选中,它就不会显示任何内容,如果只有复选框 1 ("Option 3"),则在 list2
中显示选项被勾选,如果只有复选框 2 ("Option 4") 被勾选,list3
中的选项和 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)
希望对您有所帮助!
我的 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')}
}
}
})
}
下面使用 renderUI
实现了 selectInput
的 if-else 逻辑: 1) 只要选择了单选按钮的 none,它就什么都不显示; 2) 如果选择按钮 1 ("Option 1"),它会在 list1
中显示选项; 3) 如果选择了按钮 2 ("Option 2"),只要复选框的 none 被选中,它就不会显示任何内容,如果只有复选框 1 ("Option 3"),则在 list2
中显示选项被勾选,如果只有复选框 2 ("Option 4") 被勾选,list3
中的选项和 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)
希望对您有所帮助!