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

R自定义ggplot绘图函数中str_wrap与mutate传参失效问题求助

问题根源
  • 你调用cntl函数时传入的第二个参数df$dx是全局环境下未经过管道mutate重排因子、添加换行的原始变量,而非管道流程中处理后的dx变量。你在管道里对dx做的所有修改仅存在于当前管道传递的临时数据中,没有同步到全局的df里,导致绘图和统计检验的数据源完全不一致。
  • 你的cntl函数内部统计检验部分硬编码引用了全局环境的df$control,没有使用传入函数的.data参数里的管道处理后数据,进一步加剧了数据源不匹配的问题。
    你认为文本换行导致问题属于误解,本质是函数设计和传参逻辑错误。
修正方案

第一步:重写cntl函数,移除全局变量依赖

cntl <- function(.data, varname, xlabname, maintitle){
  # 绘图逻辑复用原有实现,直接使用传入的.data数据
  print(ggplot(.data) + 
           aes(x={{varname}}, fill=progcat) +
           geom_bar(position="fill") +
           scale_fill_manual(name="Control", values=c("#84c96d", "#cecece", "#ffcf5e", "#fa6b37")) +
           xlab(xlabname) + ylab("Proportion of Cohort") +
           labs(title=maintitle) +
           theme(plot.title = element_text(hjust=0.5)))
  # 统计检验部分统一使用传入的.data数据源,避免引用全局变量
  var_vec <- .data %>% pull({{varname}})
  tab <- table(var_vec, .data$control)
  print(tab)
  print(chisq.test(tab))
  print(fisher.test(tab))
}

第二步:修改调用逻辑,不需要额外传入全局变量

df %>%
  arrange(progcat) %>%
  # 先执行str_wrap再转因子,保证换行格式和设定的因子水平一致
  mutate(dx = str_wrap(dx, width = 10),
         dx = factor(dx,
                   levels=c("Smoldering/\nMGUS", "Stage I", "Stage II", "Stage III",
                            "Plasma\nCell\nLeukemia", "Unknown"))) %>%
  # 直接传入管道内处理后的dx变量即可,不需要再传全局的df$dx
  cntl(dx, "Stage", "Long-Term Disease Control by Stage at Diagnosis")

内容的提问来源于stack exchange,提问作者MWolcott

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 22:27:03