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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:45:30