You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

关键修改说明

  1. 正确调用reactive对象:

    • selectedVar是一个reactive函数,必须通过selectedVar()获取返回值,而非Dregistros$selectedVar()(数据框中不存在名为selectedVar的列)。
    • 在renderUI中先将selectedVar()的结果赋值给var_data,让代码逻辑更清晰。
  2. 过滤数据的正确写法:

    • 使用dplyr的.data代词,通过.data[[input$variable]]直接引用选中的列名,避免reactive对象调用的混淆,写法更简洁。
    • 也可以直接用selectedVar()替代.data[[input$variable]],效果完全一致:
      filter(selectedVar() >= input$mInput[1] & selectedVar() <= input$mInput[2])
      
  3. 补充依赖包:显式加载dplyr,确保管道符%>%能正常运行。

内容的提问来源于stack exchange,提问作者Mirko Delfin Soruco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 00:20:28