Shiny中如何让slider input依赖响应式变量并随列动态更新?
问题修正方案
你的代码核心问题在于错误调用了reactive对象selectedVar,以及过滤数据时的语法错误,以下是修正后的完整代码和关键修改说明:
修正后代码
library(shiny) library(shinydashboard) library(DT) library(dplyr) # 显式加载dplyr,确保管道符正常使用 #---- Parametros de Entrada ---- Dregistros <- data.frame( "comunidades" = c("Pocona", "Cercado","Punata"), "Sexo_Total" = c(23,26,7), "Sexo_H" = c(43,16,17), "Sexo_M" = c(113,286,177) ) #----- Entorno de SHINY APP ---- ui <- dashboardPage( dashboardHeader(title = "Población Cuenca"), dashboardSidebar(width = 230, selectInput("variable","Seleccione la variable", choices = c("Total"="Sexo_Total", "Total Hombres"="Sexo_H", "Total Mujeres"="Sexo_M")), uiOutput("right_screen")), dashboardBody(DTOutput("tabla")) ) server <- function(input, output, session) { #----- SELECCION DE VARIABLES DEL CENSO---- selectedVar <- reactive({ switch(input$variable, "Sexo_Total" = Dregistros$Sexo_Total, "Sexo_H" = Dregistros$Sexo_H, "Sexo_M" = Dregistros$Sexo_M) }) #---- SLIDER INPUT ----- output$right_screen <- renderUI({ var_data <- selectedVar() # 先获取reactive对象的返回值,简化后续调用 sliderInput("mInput", label = "slider input", min = min(var_data), max = max(var_data), value = range(var_data)) }) #-----FILTRO CON VARIABLES ---- filteredData <- reactive({ Dregistros %>% filter(.data[[input$variable]] >= input$mInput[1] & .data[[input$variable]] <= input$mInput[2]) }) #---- TABLA---- output$tabla <- DT::renderDataTable({ DT::datatable(filteredData(), options = list(scrollX = TRUE)) }) } shinyApp(ui, server)
关键修改说明
正确调用reactive对象:
selectedVar是一个reactive函数,必须通过selectedVar()获取返回值,而非Dregistros$selectedVar()(数据框中不存在名为selectedVar的列)。- 在
renderUI中先将selectedVar()的结果赋值给var_data,让代码逻辑更清晰。
过滤数据的正确写法:
- 使用dplyr的
.data代词,通过.data[[input$variable]]直接引用选中的列名,避免reactive对象调用的混淆,写法更简洁。 - 也可以直接用
selectedVar()替代.data[[input$variable]],效果完全一致:filter(selectedVar() >= input$mInput[1] & selectedVar() <= input$mInput[2])
- 使用dplyr的
补充依赖包:显式加载
dplyr,确保管道符%>%能正常运行。
内容的提问来源于stack exchange,提问作者Mirko Delfin Soruco
相关产品推荐
相关产品推荐

