简体   繁体   English

R更新Shiny中的选择框

[英]R update selection boxes in Shiny

I have a problem at work. 我在工作中遇到了问题。 I am building a Shiny app and trying to subset data based on the value of three selection boxes. 我正在构建一个Shiny应用程序,并尝试根据三个选择框的值来对数据进行子集化。 My data has three variables, Commissioner, Neighbourhood and Practice. 我的数据有三个变量,专员,社区和实践。 What I need is that no matter which box the user chooses first to filter the data on, the other two update to only show relevant choices. 我需要的是,无论用户选择哪个盒子来过滤数据,其他两个更新只显示相关的选择。 The default on loading is to show all choices in all boxes. 加载时的默认值是显示所有框中的所有选项。

I've made a start but getting no where fast. 我已经开始了,但没有快速到达。 The code below shows all the choices in Commissioner on loading but nothing for the other two. 下面的代码显示了加载专员的所有选择,但其他两个没有。 When a choice is selected in the Commissioner box the Neighbourhood box updates and then when selecting a neighbourhood the Practice box updates. 在“专员”框中选择选项时,“邻居”框会更新,然后在选择“邻居”时,“实践”框会更新。

library(shiny)

ui <- fluidPage(
  fluidRow(
    div(style="display: inline-block;vertical-align:top;",
        uiOutput("Box1"),
        uiOutput("Box2"),
        uiOutput("Box3")
    )
  )
)

server <- function(input, output) {
  data <- data.frame(Commissioner = c(rep("CommA", 6), rep("CommB", 6)),
                     Neighbourhood = c(rep("Nhood1", 2), 
                                       rep("Nhood2", 2),
                                       rep("Nhood3", 2),
                                       rep("Nhood4", 2),
                                       rep("Nhood5", 2),
                                       rep("Nhood6",2)),
                     Practice = c("Prac1", "Prac2", "Prac3", "Prac4", "Prac5", 
                                  "Prac6", "Prac7", "Prac8", "Prac9", "Prac10", 
                                  "Prac11", "Prac12")
                     )

  output$Box1 = renderUI(
    selectInput("commissioner",
                  "Select a Commissioner",
                  c("All",as.character(unique(data$Commissioner))),
                  "selectcommissioner")
  )


  output$Box2 = renderUI(
    selectInput("neighbourhood",
                "Select a Neighbourhood",
                c("All",     as.character(unique(data$Neighbourhood[which(data$Commissioner ==     input$commissioner)]))),
                "selectnhood")
    )

  output$Box3 = renderUI(
    selectInput("practice", 
                "Select a Practice", 
                c("All", as.character(unique(data$Practice[which(data$Neighbourhood == input$neighbourhood)]))), 
                "selectpractice")
    )


}

shinyApp(ui = ui, server = server)

I have modified your server code to achieve what you want. 我已经修改了你的服务器代码来实现你想要的。

server <- function(input, output) {
  data <- data.frame(Commissioner = c(rep("CommA", 6), rep("CommB", 6)),
                     Neighbourhood = c(rep("Nhood1", 2), 
                                       rep("Nhood2", 2),
                                       rep("Nhood3", 2),
                                       rep("Nhood4", 2),
                                       rep("Nhood5", 2),
                                       rep("Nhood6",2)),
                     Practice = c("Prac1", "Prac2", "Prac3", "Prac4", "Prac5", 
                                  "Prac6", "Prac7", "Prac8", "Prac9", "Prac10", 
                                  "Prac11", "Prac12")
  )

  output$Box1 = renderUI(
    selectInput("commissioner",
                "Select a Commissioner",
                c("All",as.character(unique(data$Commissioner))),
                "selectcommissioner")
  )


  output$Box2 = renderUI({

    if(!is.null(input$commissioner))
    {
      if(input$commissioner == "All"){
        opts1 <- c("All", as.character(unique(data$Neighbourhood)))
      }else{
        opts1 <-  c("All",as.character(unique(data$Neighbourhood[which(data$Commissioner==input$commissioner)])))
      }
    }
    selectInput("neighbourhood",
                "Select a Neighbourhood",
                opts1,
                "selectnhood")
  })

  output$Box3 = renderUI({


    if(!is.null(input$neighbourhood))
    {
      if(input$neighbourhood == "All"){
        opts2 <- c("All", as.character(unique(data$Practice)))
      }else{
        opts2 <- c("All", as.character(unique(data$Practice[which(data$Neighbourhood == input$neighbourhood)])))
      }
    }
    selectInput("practice", 
                "Select a Practice", 
               opts2, 
                "selectpractice")

  })


}

Hope it helps! 希望能帮助到你!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM