我正在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)