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
相关产品推荐
相关产品推荐

