Shiny R基于复选框选变量的响应式K-means分析与位置聚类可视化
完整实现代码
library(shiny) library(DT) library(ggplot2) # 初始化数据集 df <- as.data.frame(cbind( lat = rnorm(150, mean = 30, sd = 5), lon = rnorm(150, mean = 10, sd = 5), iris[, 1:4] )) # UI部分 ui <- fluidPage( sidebarLayout( sidebarPanel( checkboxGroupInput("show_vars", "k-means可选特征变量", names(df[, 3:6]), selected = names(df[, 3:6])), numericInput('clusters', '聚类数量', 3, min = 1, max = 9), ), mainPanel( DT::dataTableOutput('mytable1'), plotOutput("cluster_plot") ) ) ) # 服务端部分 server <- function(input, output) { # 响应式数据集:动态计算聚类结果并绑定经纬度信息 processed_df <- reactive({ # 提取用户选中的特征变量用于聚类 selected_data <- df[, input$show_vars, drop = FALSE] # 运行k-means聚类 km_res <- kmeans(selected_data, centers = input$clusters) # 拼接原始经纬度、选中特征、聚类标签为完整数据集,聚类标签转为因子适配离散配色 cbind(df[, c("lat", "lon")], selected_data, cluster = as.factor(km_res$cluster)) }) # 渲染带聚类结果的交互表格 output$mytable1 <- DT::renderDataTable({ DT::datatable(processed_df()) }) # 渲染经纬度空间聚类散点图 output$cluster_plot <- renderPlot({ ggplot(processed_df(), aes(x = lon, y = lat, color = cluster)) + geom_point(size = 2) + labs(x = "经度", y = "纬度", color = "聚类类别") + theme_bw() }) } shinyApp(ui, server)
关键逻辑说明
- 用
reactive()构造响应式数据集,监听用户选择的特征、聚类数量两个输入的变化,自动触发聚类重计算 - 聚类完成后直接拼接原始经纬度列、选中特征列、聚类标签,保证表格和绘图用的数据源完全一致
- 聚类标签转为因子类型,适配ggplot离散分类配色规则
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

