我正在try 动态更新我的shiny 应用程序中的过滤器.例如,如果 Select California个州,那么城市过滤器中只有来自加利福尼亚州的城市.

但是,如果我 Select California,代码会显示所有城市在pregrame中,无论它们是否在加利福尼亚州.

我已经try 过各种try ,但不确定如何更新过滤后的数据,而不创建一个连续循环或 Select 过滤器和它重置自己.原始数据大约有12列,我正在寻找过滤.

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({
      data.table(
        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)

推荐答案

如果SelectizeInput中的一个接收到 Select ,则需要运行updateSelectizeInput.因此,您可以包括以下代码:前lapplyobserveEvent附加到所有SelectizeInput,而里面的lapply包含更新.

lapply(
  X = cols_to_filter,
  FUN = function(colChanged) {
    observeEvent(input[[paste0("filter_", colChanged)]], {
      lapply(
        X = cols_to_filter,
        FUN = function(colToChange) {
          updateSelectizeInput(
            inputId = paste0("filter_", colToChange),
            choices = filtered_data()[[colToChange]],
            selected = input[[paste0("filter_", colToChange)]]
          )
        }
      )
    }, ignoreNULL = FALSE)
  }
)

enter image description here

R相关问答推荐

在R中使用自定义函数时如何删除该函数的一部分?

如何将具有重复名称的收件箱合并到R中的另一列中,而结果不同?

使用spatVector裁剪网格数据时出现的问题

使用R的序列覆盖

判断字符串中数字的连续性

在另一个函数中调用ggplot2美学

如何在modelsummary中重命名统计数据?

如何读取CSV的特定列时,给定标题作为向量

打印XTS对象

用约翰逊分布进行均值比较

为什么在BASE R中绘制线条时会看到线上的点?

来自程序包AFEX和amp;的类/函数和NICE_TABLE&冲突

如何构建一个for循环来循环处理动物ID?

数据集上的R循环和存储模型系数

主题(Legend.key=Element_RECT(Fill=&Quot;White&Quot;))不起作用

有毒元素与表观遗传年龄的回归模型

使用ggplot2绘制具有边缘分布的坡度图

如何在矩阵图中按标准对数据进行分组以绘制矩阵

从字符串01JAN2021创建日期

通过不完全重叠的多个柱连接