向含wilcox_effsize的R函数传递变量名报错求助
解决方法
问题核心是你直接在公式中写var ~ group时,R会把var和group当作数据框的列名,而非你传入的参数值。需要动态构造匹配传入参数的公式,以下两种方案均可解决:
方案1:用reformulate构造公式(适配字符串参数)
library(rstatix) library(dplyr) effect_size <- function(df, var, group){ # 动态生成公式:响应变量为传入的var,分组变量为传入的group formula <- reformulate(group, response = var) es <- df %>% wilcox_effsize(formula) return(es) }
修正测试数据并验证
你的测试数据存在行数不匹配问题(tpd_time仅2个值,但CK/PK有150个),先修正数据再调用:
data <- data.frame(tpd_time = rep(c("yes", "no"), each = 150), CK = seq(0.1, 2, length.out = 300), PK = seq(0.1, 2, length.out = 300)) effect_size(df = data, var = "CK", group = "tpd_time")
方案2:用tidy eval语法(支持裸变量名/字符串双输入)
如果需要同时支持传入裸变量名(如var = CK)和字符串参数,可借助rlang的符号转换功能:
library(rstatix) library(dplyr) library(rlang) effect_size <- function(df, var, group){ # 将参数转换为R可识别的符号 var_sym <- ensym(var) group_sym <- ensym(group) # 通过!!注入符号到公式中 es <- df %>% wilcox_effsize(!!var_sym ~ !!group_sym) return(es) }
两种调用方式均有效
# 字符串参数调用 effect_size(df = data, var = "CK", group = "tpd_time") # 裸变量名调用 effect_size(df = data, var = CK, group = tpd_time)
关于{{group}}报错的原因
{{}}是tidyverse中直接引用函数参数的语法,但它无法直接在公式右侧作为列名解析——公式有独立的求值环境,必须通过!!ensym()组合将参数转换为符号后注入,或直接用reformulate构造公式更简洁。
内容的提问来源于stack exchange,提问作者Faisal Mustafa
相关产品推荐
相关产品推荐

