基于ReactiveUI问题的ReactiveUI

基于ReactiveUI问题的ReactiveUI,r,shiny,R,Shiny,我的代码如下,演示站点如下: 第一个输入(下拉)加载global.R中定义的数据帧 第二个输入(下拉)通过df的“服务”列过滤此数据帧 第三个输入(复选框)通过df的“Round”列进一步过滤数据帧 问题在于,在步骤1中显示了数据帧的所有可用复选框,而不是在步骤2中按“服务”过滤后显示的可用复选框。下面我有一个。clientData>serviceFiltered\u clientData>roundFiltered\u clientData shinyServer(function(input

我的代码如下,演示站点如下:

第一个输入(下拉)加载global.R中定义的数据帧

第二个输入(下拉)通过df的“服务”列过滤此数据帧

第三个输入(复选框)通过df的“Round”列进一步过滤数据帧

问题在于,在步骤1中显示了数据帧的所有可用复选框,而不是在步骤2中按“服务”过滤后显示的可用复选框。下面我有一个。clientData>serviceFiltered\u clientData>roundFiltered\u clientData

shinyServer(function(input, output) {

  # First UI input (Service column) filter clientData 
  output$serviceControls <- renderUI({
    if (is.null(clientData()))
      return("No client selected")
    selectInput("service_select", 
                "Choose Service:", 
                choices = as.character(levels(clientData()$Service.Name)),
                selected = input$service_select
    )
  })

  # Second UI input (Rounds column) filter service-filtered clientData  
  output$roundControls <- renderUI({
    if (is.null(serviceFiltered_clientData()))
      return("No service selected")
    checkboxGroupInput("round_select", 
                       "Choose Round:", 
                       choices = as.character(levels(serviceFiltered_clientData()$Round)))
  })  

  # First data load (client data)
  clientData <- reactive({
    if (is.null(input$client_select))
      return(NULL)
    get(input$client_select)
  })

  # Second data load (filter by service column)
  serviceFiltered_clientData <- reactive({
    dat <- clientData()
    if (is.null(dat))
      return(NULL)
    if (!is.null(input$service_select)) # !
      dat <- dat[dat$Service.Name %in% input$service_select,]
    return(dat)
  })

  # Third data load (filter by round column)
  roundFiltered_clientData <- reactive({
    dat <- serviceFiltered_clientData()
    if (is.null(dat))
      return(NULL)
    if (!is.null(input$round_select)) # !
      dat <- dat[dat$Round %in% input$round_select,]
    return(dat)
  })


  # Audit count panel
  output$auditsCount <- renderText({
    if (is.null(roundFiltered_clientData()))
      return("No client selected")
    paste("Total Audits:",nrow(roundFiltered_clientData()))
  })
shinyServer(功能(输入、输出){
#第一个UI输入(服务列)筛选clientData

output$serviceControls您可以通过分组checkboxInputs并根据需要使用有选择地显示和隐藏来解决此问题

步骤:

  • 对于每个按服务筛选的情况,创建一个动态列表,列出哪些复选框有意义
  • 根据您的下拉菜单#2(服务)选择创建条件
  • 仅显示通过条件的复选框选项
  • 伪代码

    # Only show this panel if a certain Service is selected
          conditionalPanel(
             condition = "input.service.option == 'filter2'",
             checkboxInput(inputId = "opt.col1", label = "label1", value = FALSE),
             checkboxInput(inputId = "opt.col3", label = "label3", value = FALSE),
             )
    

    RStudio的人和(特别是UI.R中使用多个conditionalPanel的代码部分)一直以来都在使用菊花链,问题是“Round”列被加载为一个因子,而因子在子集后仍然作为数据帧属性。因此我需要使用droplevels()在对数据进行子集设置之后。我添加了
    dat,感谢回复Ram。如果我明确列出了基于服务的可用轮次,则界面不再是动态的,对吗?随着数据的更新(随着时间推移)添加了更多的轮次,或者现有轮次的名称可能已被编辑。我需要根据数据动态设置复选框。是的,同意。能否动态形成列表?我的建议是首先创建所有复选框的超集(如果可能),并使用conditionalPanel显示正确的复选框。
    
      # Second data load (filter by service column)
      serviceFiltered_clientData <- reactive({
        dat <- clientData()
        if (is.null(dat))
          return(NULL)
        if (!is.null(input$service_select)) # !
          dat <- dat[dat$Service.Name %in% input$service_select,]
        dat <- droplevels(dat) # This is what fixed it
        return(dat)
      })