2017-02-16 1 views
0

두 개 이상의 옵션이 유효 할 때 conditionalPanel 문제가 있습니다.둘 이상의 조건이있는 ConditionalPanel이 참일 경우

사용자가 두 가지를 차례로 선택하는 코드의 일부로 데이터베이스에 필터가 만들어집니다.

첫 번째 선택에서 상태는 가능성 목록에서 선택됩니다. 사용자가 둘 이상의 주를 선택할 수 있다는 것을 아는 것이 중요합니다.

두 번째 선택에서 도시는 가능성 목록에서 선택됩니다. 이 두 번째 선택에서 사용자는 둘 이상의 도시를 선택할 수도 있습니다.

내가 말했듯이 중요한 정보는 사용자가 둘 이상의 주를 선택할 수 있다는 것입니다. 따라서 여러 주 선택 상태에서 모든 선택된 주에 도시가 표시되어야합니다.

사용자가 하나의 상태 만 선택하면 모든 것이 올바르게 작동합니다. 두 개 이상의 상태를 선택하면 내 코드의 문제가 시작되고 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) 
+0

그것은 당신이 당신의 시간을'conditionalPanel' – krish

+0

감사의를 사용하지 않고 기능을 수행 할 수있는 경우에 오히려 checkbox''보다'selectInput' 옵션을 사용하는 경우 해결책을 마련하는 것이 더 쉬울 수 있습니다, @krish selectInput을 사용하면 사용자가 한 번에 둘 이상의 상태를 선택할 수 없습니다. 맞습니까? 하나 이상의 상태를 선택하는 것은 분석을 위해 매우 빈번합니다. –

+0

'selectInput'과'selectizeInput' 둘 다'multiple'이라는 인자를 가지고 있습니다. 여러 개의 선택을 허용하는 'TRUE'로 설정할 수 있습니다 – krish

답변

0

당신은

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')", 

EDIT로 조건을 변경해야 솔루션을 의견에 대한 문의

이것은 확실히 최선의 해결책은 아니지만, 이것은 당신이 원하는 것을주고 좋은 결과를 가져다 줄 것입니다.

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) 
+0

굉장하다, @krish! 도와 주셔서 정말로 고맙습니다. 당신이 나를 많이 돕기 때문에, 선택된 도시의 모든 도시 옵션을 하나의 메뉴에 알파벳 순으로 입력해야한다면 적응해야 할 점을 말해 줄 수 있습니까? –

+0

@PedroCortez,이 답변으로 문제를 해결할 수 있다면 투표 화살표 아래의 체크 표시를 사용하여 [승인 된 것으로 표시] (https://stackoverflow.com/help/someone-answers)를 고려하십시오. 한편, 단일 메뉴에서 도시 옵션을 살펴 보겠습니다. 고맙습니다! – krish

+0

확실히, @krish! 나는 이미 받아 들여진 답을 만들려고했는데, 나는 그 방법을 확인함으로써 그 게시물을 닫을 것이라고 믿었 기 때문에 그것을하지 못했습니다. 그리고 나는 여전히 닫히기 전에 그 의심을 꺼내고 싶습니다. 도움을 주셔서 대단히 감사합니다! –

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}) 
+0

죄송합니다. @Malvina_a. 여기 내 첫 번째 게시물이었고 내 문제를 보여주기에 충분하다고 생각했습니다. 나는 이미 내 게시물을 편집하고 전체 코드를 넣었습니다. 이해하기 쉽고 내 문제에 대한 해결책을 찾을 수 있기를 바랍니다. 시간이지나면서 솔루션을 사용하려고했지만 문제를 해결할 수 없었습니다. 나는 내가 다른 것을 잘못했는지 모른다./ –

관련 문제