2017-12-01 7 views
0

例:Filter one selectInput based on selection from another selectInput?依存フィルタから取ら

私は、ユーザーが複数のボックスを選択することができ、その後、いくつかのデータが生成された光沢のあるアプリを作成しようとしています。たとえば、最初の「火星」をクリックし、次にキャンディーがフィルタリングされた2番目のオプション「スニッカーズ」を選択すると、スニッカーをクリックしたときに復元されるのはなぜですか?

library(shiny) 
library(shinydashboard) 
library(shinyWidgets) 
## 
ui <- shinyUI({ 
    sidebarPanel(

    htmlOutput("brand_selector"), 
    htmlOutput("candy_selector")) 

}) 
## 
server <- shinyServer(function(input, output) { 
    candyData <- read.table(
    text = "Brand  Candy 
    Nestle  100Grand 
    Netle  Butterfinger 
    Nestle  Crunch 
    Hershey's KitKat 
    Hershey's Reeses 
    Hershey's Mounds 
    Mars  Snickers 
    Mars  Twix 
    Mars  M&Ms", 
    header = TRUE, 
    stringsAsFactors = FALSE) 

    output$brand_selector <- renderUI({ 

    available2 <- candyData 
    if(NROW(input$candy) > 0) available2 <- candyData[candyData$Candy %in% input$candy, ] 

    pickerInput(
     inputId = "brand", 
     label = "Brand:", 
     choices = as.character(unique(available2$Brand)), 
     multiple = T,options = list(`actions-box` = TRUE)) 

    }) 

    output$candy_selector <- renderUI({ 

    available <- candyData 
    if(NROW(input$brand > 0)) available <- candyData[candyData$Brand %in% input$brand, ] 

    pickerInput(
     inputId = "candy", 
     label = "Candy:", 
     choices = unique(available$Candy), 
     multiple = T,options = list(`actions-box` = TRUE)) 

    }) 

}) 
## 
shinyApp(ui = ui, server = server) 

答えて

0

問題は、あなたの入力変数のUI共依存をレンダリングしていることから来て、1つが変化したときに全体のUIは、入力変数の値を含む再レンダリング。このユースケースには、update*Input関数を使用する方が良いでしょう。あなたの例のための有効なバージョンは次のとおりです

library(shiny) 
library(shinydashboard) 
library(shinyWidgets) 
## 
ui <- shinyUI({ 
    sidebarPanel(

    htmlOutput("brand_selector"), 
    htmlOutput("candy_selector")) 

}) 
## 
server <- shinyServer(function(input, output,session) { 
    candyData <- read.table(
    text = "Brand  Candy 
    Nestle  100Grand 
    Netle  Butterfinger 
    Nestle  Crunch 
    Hershey's KitKat 
    Hershey's Reeses 
    Hershey's Mounds 
    Mars  Snickers 
    Mars  Twix 
    Mars  M&Ms", 
    header = TRUE, 
    stringsAsFactors = FALSE) 
    observeEvent({ 
    input$candy 
    }, 
    { 
    available2 <- candyData 
    if(NROW(input$candy) > 0) available2 <- candyData[candyData$Candy %in% input$candy, ] 
    updatePickerInput(
     session = session, 
     inputId = "brand", 
     choices = as.character(unique(available2$Brand)), 
     selected = input$brand 
    ) 
    }, 
    ignoreInit = FALSE, 
    ignoreNULL = FALSE) 
    output$brand_selector <- renderUI({ 


    pickerInput(
     inputId = "brand", 
     label = "Brand:", 
     choices = NULL, 
     multiple = T,options = list(`actions-box` = TRUE)) 

    }) 
    observeEvent({ 
    input$brand 
    },{ 
    available <- candyData 
    if(NROW(input$brand > 0)) available <- candyData[candyData$Brand %in% input$brand, ] 
    updatePickerInput(
     session = session, 
     inputId = "candy", 
     choices = unique(available$Candy), 
     selected = input$candy 
    ) 
    }, 
    ignoreInit = FALSE, 
    ignoreNULL = FALSE) 
    output$candy_selector <- renderUI({ 


    pickerInput(
     inputId = "candy", 
     label = "Candy:", 
     choices = NULL, 
     multiple = T,options = list(`actions-box` = TRUE)) 

    }) 

}) 
## 
shinyApp(ui = ui, server = server) 
関連する問題