具有多个条件的ConditionalPanel为真

时间:2017-02-16 12:33:52

标签: r shiny shinydashboard

当多个选项有效时,我遇到了条件面板问题。

我的代码的一部分,用户按顺序做出两个选择,以便在数据库中生成过滤器。

在第一个选择中,将从可能性列表中选择一个州。重要的是要知道用户可以选择多个州。

在第二个选择中,将从可能性列表中选择城市。在第二个选择中,用户还可以选择多个城市。

正如我所说,重要信息是用户可以选择多个州,因此从多个州的选择中,应该显示所有选定州的城市。

当用户只选择一个状态时,一切正常。我的代码问题在它选择多个状态时启动,ConditionalPanel只是消失(没有显示任何内容,甚至没有显示的第一个选项)。它仅在用户删除选择时再次出现,仅保留一个。

如果有人有几分钟时间帮助我理清我面临的这个问题,我将非常感激。

library(shiny)
library(shinydashboard)
library(readr)

state_options <- c("1. Texas", "2. Massachusetts", "3. Colorado")
options_state_texas <- c("Alamo", "Alton", "Angus", "Atlanta", "Aurora", 
                         "Brownsboro", "Premont", "Princeton", "Red Oak",
                        "Staples", "Texas City")
options_state_massachusetts <- c("Boston", "Cambridge", "Chelsea", "Springfield")
options_state_colorado <- c("Aspen", "Aurora", "Avon", "Cortez", "Denver",
                            "Vail")


createMainPanel <- function(index_id) {
    mainPanel(
        width = 12,
        tabsetPanel(
            tabPanel(
                strong("Split"),
                br(),
                box(
                    title = strong("State:"),
                    status = "primary",
                    width = 3,
                    collapsible = TRUE,
                    checkboxGroupInput(
                        inputId = paste0(index_id, "_state"),
                        label = NULL,
                        choices = state_options
                    )
                ),
                conditionalPanel(
                    condition = "input.distribution_of_sales_sub_state == '1. Texas'",
                    box(
                        title = strong("Cities state 1:"),
                        status = "primary",
                        width = 3,
                        collapsible = TRUE,
                        checkboxGroupInput(
                            inputId = paste0(index_id, "_checkbox_city_1"),
                            label = NULL,
                            choices = options_state_texas
                        )
                    )
                ),
                conditionalPanel(
                    condition = "input.distribution_of_sales_sub_state == '2. Massachusetts'",
                    box(
                        title = strong("Cities state 2:"),
                        status = "primary",
                        width = 3,
                        collapsible = TRUE,
                        checkboxGroupInput(
                            inputId = paste0(index_id, "_checkbox_city_2"),
                            label = NULL,
                            choices = options_state_massachusetts
                        )
                    )
                ),
                conditionalPanel(
                    condition = "input.distribution_of_sales_sub_state == '3. Colorado'",
                    box(
                        title = strong("Cities state 3:"),
                        status = "primary",
                        width = 3,
                        collapsible = TRUE,
                        checkboxGroupInput(
                            inputId = paste0(index_id, "_checkbox_city_3"),
                            label = NULL,
                            choices = options_state_colorado
                        )
                    )
                )
            )
        )
    )
}

createTabItem <- function(title, index_id) {
    tabItem(
        tabName <- paste0(index_id, "_tab"),
        h2(title),
        createMainPanel(index_id))
}

createBox <- function(session, index_id, opcoes){
    updateCheckboxGroupInput(
        session,
        index_id,
        choices = c(opcoes))
}

ui <- dashboardPage(
    dashboardHeader(disable = TRUE),
    dashboardSidebar(
        title = img(src='logo.png', height = 60, width = 180, style = "display: block; 
                    margin-left: auto; margin-right: auto;"),
        HTML("<br><br>"),
        width = 230,
        sidebarMenu(
            menuItem(strong("Sales"), tabName = "distribution_of_sales_sub_tab")
        )
    ),
    dashboardBody(
        tabItems(
            createTabItem(strong("Distribution of sales"),
                          "distribution_of_sales_sub")
        )
    )
)


server <- function(input, output, session) { 
    observe({
        createBox(session,"distribution_of_sales_sub_state", state_options)
        createBox(session,"distribution_of_sales_sub_checkbox_city_1", 
                  options_state_texas)
        createBox(session,"distribution_of_sales_sub_checkbox_city_2", 
                  options_state_massachusetts)
        createBox(session,"distribution_of_sales_sub_checkbox_city_3", 
                  options_state_colorado)
    })
}

shinyApp(ui, server)

2 个答案:

答案 0 :(得分:1)

您需要将条件更改为

condition = "input.distribution_of_sales_sub_state.includes('1. Texas')",

condition = "input.distribution_of_sales_sub_state.includes('2. Massachusetts')",

condition = "input.distribution_of_sales_sub_state.includes('3. Colorado')",

编辑:评论中的问题解决方案

这绝对不是最好的解决方案,但这应该能满足您的需求,并且是让它变得更好的良好开端。

library(shiny)
library(shinydashboard)
library(readr)

state_options <- c("1. Texas", "2. Massachusetts", "3. Colorado")
options_state_texas <- c("Alamo", "Alton", "Angus", "Atlanta", "Aurora", 
                         "Brownsboro", "Premont", "Princeton", "Red Oak",
                         "Staples", "Texas City")
options_state_massachusetts <- c("Boston", "Cambridge", "Chelsea", "Springfield")
options_state_colorado <- c("Aspen", "Aurora", "Avon", "Cortez", "Denver",
                            "Vail")

city_options <- c()

createMainPanel <- function(index_id) {
  mainPanel(
    width = 12,
    tabsetPanel(
      tabPanel(
        strong("Split"),
        br(),
        box(
          title = strong("State:"),
          status = "primary",
          width = 3,
          collapsible = TRUE,
          checkboxGroupInput(
            inputId = paste0(index_id, "_state"),
            label = NULL,
            choices = state_options
          )
        ),
        conditionalPanel(
          condition = "input.distribution_of_sales_sub_state != ''",
          uiOutput("city")
        )
      )
    )
  )
}

createTabItem <- function(title, index_id) {
  tabItem(
    tabName <- paste0(index_id, "_tab"),
    h2(title),
    createMainPanel(index_id))
}

createBox <- function(session, index_id, opcoes){
  updateCheckboxGroupInput(
    session,
    index_id,
    choices = c(opcoes))
}

ui <- dashboardPage(
  dashboardHeader(disable = TRUE),
  dashboardSidebar(
    title = img(src='logo.png', height = 60, width = 180, style = "display: block; 
                    margin-left: auto; margin-right: auto;"),
    HTML("<br><br>"),
    width = 230,
    sidebarMenu(
      menuItem(strong("Sales"), tabName = "distribution_of_sales_sub_tab")
    )
  ),
  dashboardBody(
    tabItems(
      createTabItem(strong("Distribution of sales"),
                    "distribution_of_sales_sub")
    )
  )
)


server <- function(input, output, session) { 

  output$city <- renderUI({
    box(
      title = strong("Cities state:"),
      status = "primary",
      width = 3,
      collapsible = TRUE,
      checkboxGroupInput(
        inputId = paste0("distribution_of_sales_sub", "_checkbox_city_1"),
        label = NULL,
        choices = cities()
      )
    )
  })
  city_options1 <- c()
  city_options2 <- c()
  city_options3 <- c()
  cities <- reactive({
    if(c("1. Texas") %in% input$distribution_of_sales_sub_state ){
      city_options1<- c(options_state_texas)
    }
    if (c("2. Massachusetts") %in% input$distribution_of_sales_sub_state) {
      city_options2 <- c(options_state_massachusetts)
    }
    if (c("3. Colorado") %in% input$distribution_of_sales_sub_state ) {
      city_options3 <- c(options_state_colorado)
    }
    city_options <- c(city_options1,city_options2, city_options3)
    city_options <- sort(city_options)
  })


  observe({
    createBox(session,"distribution_of_sales_sub_state", state_options)
    createBox(session,"distribution_of_sales_sub_checkbox_city_1", 
              options_state_texas)
    createBox(session,"distribution_of_sales_sub_checkbox_city_2", 
              options_state_massachusetts)
    createBox(session,"distribution_of_sales_sub_checkbox_city_3", 
              options_state_colorado)
  })
}

shinyApp(ui, server)

答案 1 :(得分:0)

您的代码根本不可复制,您应该在发布问题之前注意这一点。

如果没有正确的代码和数据,我的猜测是将您的所有条件移至server.R。所以在ui.R中你应该为每个州创建:uiOutput("state1")(对于第一个条件状态:德克萨斯州),然后在server.R

output$state1 <- renderUI({
 if(any(input$state == '1. Texas')){
box(
                            title = strong("Cities state 1:"),
                            status = "primary",
                            width = 3,
                            collapsible = TRUE,
                            checkboxGroupInput(
                                inputId = "checkbox_city_1"),
                                label = NULL,
                                choices = options_state_texas
                            )}
else{NULL})