如何动态更新过滤器?

问题描述 投票:0回答:1

我正在尝试动态更新我闪亮的应用程序中的过滤器。例如,如果选择

California
作为州,则城市过滤器中填充的唯一城市应该是加利福尼亚州的城市。

但是,如果我选择

California
,代码会显示数据框中的所有城市,无论它们是否位于加利福尼亚州。

我尝试了各种尝试,但不确定如何在不创建连续循环或选择过滤器并自行重置的情况下更新过滤后的数据。我要过滤的原始数据大约有十二列。

library(shiny)
library(data.table)
library(DT)

ui <- 
  fluidPage(
    
    # Application title
    titlePanel("Display CSV Data"),
    
    # Sidebar layout with input and output definitions
    sidebarLayout(
      
      # Sidebar panel for inputs
      sidebarPanel(
        # No input needed if the CSV is static
        
        # Use selectizeInput for filtering
        uiOutput("filter_ui")
      ),
      
      # Main panel for displaying output
      mainPanel(
        # Output: DataTable
        dataTableOutput("table")
      )
    )
  )

server <- 
  function(input, output, session) {
    
    # Read the CSV file into a data table and display as a DataTable
    cols_to_filter <- c('state', 'city', 'county')
    
    data <- reactive({
      tibble(
        state = c("California", "California", "California", "New York", "New York", "Texas", "Texas", "Texas"),
        city = c("Los Angeles", "San Francisco", "Claremont", "New York", "Buffalo", "Houston", "Austin", "San Marcos"),
        county = c("Los Angeles", "San Francisco", "Los Angeles", "New York", "Erie", "Harris", "Travis", "Hays"),
        population = c(3979576, 883305, 36161, 8336817, 256902, 2325502, 964254, 65053)  # Fictional population figures
      )
    })
    
    observe({
      setkeyv(data(), cols_to_filter)
    })
    
    # Generate selectizeInput for filtering
    output$filter_ui <- renderUI({
      filter_inputs <- lapply(cols_to_filter, function(col) {
        selectizeInput(
          inputId = paste0("filter_", col),
          label = col,
          choices = c("", sort(unique(data()[[col]]))),
          multiple = TRUE,
          options = list(
            placeholder = 'Select values'
          )
        )
      })
      
      do.call(tagList, filter_inputs)
    })
    
    # Filter the data table based on user selections
    filtered_data <- reactive({
      filtered <- data()
      
      for (col in cols_to_filter) {
        filter_values <- input[[paste0("filter_", col)]]
        if (length(filter_values) > 0) {
          filtered <- filtered[get(col) %in% filter_values]
        }
      }
      
      filtered
    })
    
    # Display the filtered data table
    output$table <- renderDataTable({
      filtered_data()
    })
  }

shinyApp(ui = ui, server = server)
r shiny
1个回答
0
投票

for
循环更改为
lapply
并使用
.data[col]
进行过滤。试试这个

# Filter the data table based on user selections
filtered_data <- reactive({
  filtered <- data()
  #for (col in cols_to_filter) {
  lapply(cols_to_filter, function(col) {
    if (length(input[[paste0("filter_", col)]]) > 0) {
      print(input[[paste0("filter_", col)]])
      filter_values <- input[[paste0("filter_", col)]]
      filtered <<- filtered %>% dplyr::filter(.data[[col]] %in% filter_values)
    }
  })
  
  filtered
})
© www.soinside.com 2019 - 2024. All rights reserved.