2017-02-16 13 views
0

複数のオプションが有効な場合、条件付きパネル問題が発生します。複数の条件を持つ条件付きパネルが真です

ユーザーが2つの選択肢を順番に選択するコードの一部で、データベースにフィルタが作成されます。

第1の選択肢では、状態は可能性のリストから選択されます。ユーザーが複数の状態を選択できることを知ることは重要です。

2番目の選択肢では、都市は可能性のリストから選択されます。この第2の選択肢では、ユーザは複数の都市を選択することもできる。

私が言ったように、重要な情報は、ユーザーが複数の州を選択できることです。その州の複数の選択肢から、すべての選択された州の都市を示す必要があります。

ユーザーが1つの状態のみを選択した場合、すべて正常に動作します。私のコードの問題は、複数の状態を選択すると開始され、ConditionalPanelは単に消えます(何も表示されず、すでに表示されている最初のオプションさえも表示されません)。ユーザーが選択項目を削除したときにのみ表示され、1つだけ保持されます。

私が直面しているこの問題を解決する手助けをしてくれる人がいれば、非常に感謝しています。

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

素晴らしい、@キリスト!あなたの助けに感謝します。 あなたが私をたくさん助けてくれているので、選択した州のすべての都市のオプションをアルファベット順に1つのメニューに入れる必要がある場合は、どうすればいいでしょうか? –

+0

@PedroCortez、この回答があなたの問題の解決に役立つ場合は、投票矢印の下にあるチェックマークを使用して[受け入れ可能とマークする](https://stackoverflow.com/help/someone-answers)を検討してください。一方、都市のオプションを1つのメニューに表示する方法を検討します。ありがとうございました! – krish

+0

確かに、@krish!私は既に受け入れられた答えを出そうとしていました。私はそれを確認することによって、私はその記事を閉じると信じていました。そして、私はまだクローズする前にその疑いを外に出したい。 ありがとうございました! –

0

あなたのコードは全く再現できません。質問を投稿する前に注意してください。

適切なコードやデータがないと、あなたの条件はすべてserver.Rに移動することになります。だから、ui.Rに、あなたはそれぞれの状態のために作成する必要があります。uiOutput("state1")を(その最初の条件付き状態について:テキサス州)、その後、server.Rに:SOLUTION:

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何が起こったのは残念です。 ここに私の最初の投稿だったし、私の問題を示すのに十分だと思った。 私はすでに私の投稿を編集し、コード全体を入れました。 私は今、理解しやすく、おそらく私の問題の解決策を見つけることを望みます。 あなたのソリューションを使用しようとしましたが、問題を解決できませんでした。私は他の何かが間違っているかどうかわからない=/ –

関連する問題