我正在尝试动态更新我闪亮的应用程序中的过滤器。例如,如果选择
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)
将
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
})