Shiny Dashboard中checkboxGroupInput按性别绘制散点图报错求助
解决Shiny Dashboard中checkboxGroupInput筛选性别时散点图的美学长度错误
问题核心
你遇到的错误根源是ggplot使用的过滤后数据集,和你传入美学映射的向量长度不匹配:
- 你通过
filter(dfs, Gender%in%input$g)得到了筛选后的数据集,但x/y变量、颜色映射、交互tooltip等都直接引用了原始完整数据集dfs的列。当只选女性时,筛选后数据行数和原始数据集不一致,就触发了美学长度不匹配的错误。
修复步骤及代码
修改Server逻辑
核心是所有数据操作都基于过滤后的数据集,而非原始dfs:
# SERVER plot_data <- reactive({ filter(dfs, Gender %in% input$g) }) myplot2 <- reactive({ # 先获取过滤后的数据集 filtered_df <- plot_data() # 从过滤后的数据集中提取x/y变量 x1 <- as.numeric(filtered_df[[input$var1]]) y1 <- as.numeric(filtered_df[[input$var2]]) # 简化相关系数计算逻辑 c <- switch(input$c, pearson = cor.test(x1, y1, na.omit = TRUE, method = "pearson"), spearman = cor.test(x1, y1, na.omit = TRUE, method = "spearman"), kendall = cor.test(x1, y1, na.omit = TRUE, method = "kendall")) a <- round(c$p.value, 3) b <- round(c$estimate, 3) x_str <- paste0("P-value = ", a, "\n", input$c, " correlation coefficient = ", b) # ggplot全部使用过滤后的数据集 scatter <- ggplot(filtered_df, aes(x = .data[[input$var1]], y = .data[[input$var2]], color = Gender)) + geom_point_interactive(size = 2.5, tooltip = filtered_df$p_ID, data_id = filtered_df$p_ID, position = position_jitter(h = 5, w = 2)) + theme_ipsum() + stat_smooth(method = "lm", col = "#C42126", se = FALSE, size = 1) + xlab(input$var1) + ylab(input$var2) + # 可选:把相关系数结果标注在图上 annotate("text", x = Inf, y = Inf, label = x_str, hjust = 1.1, vjust = 1.1) scatter }) output$plot2 <- renderGirafe({ girafe(ggobj = myplot2(), width_svg = 14, height_svg = 8, options = list( opts_sizing(rescale = FALSE), opts_toolbar(saveaspng = FALSE), opts_tooltip(use_fill = TRUE))) })
关键修改点
- 将过滤后的数据集命名为
plot_data(更语义化),在绘图逻辑中先获取该数据集赋值给filtered_df - x/y变量从
filtered_df中提取,确保和绘图数据行数完全一致 - 相关系数计算使用过滤后的变量,得到的是当前筛选数据的相关系数(符合交互逻辑)
- ggplot的美学映射和交互参数全部使用
filtered_df中的列,彻底避免长度不匹配问题 - 用
switch简化了相关系数方法的判断逻辑,代码更简洁
UI代码无需修改
你的UI部分逻辑正常,保持原代码即可。
内容的提问来源于stack exchange,提问作者Joman
相关产品推荐
相关产品推荐

