R中自定义函数内调用tukey_hsd后使用add_xy_position报错如何解决
问题成因
- 核心原因是rstatix包的函数基于tidyverse非标准评估(NSE)机制实现,你自定义函数中直接将形参名
grouping_variable写入公式,公式解析时会将其识别为字面量的变量名,而非你传入的实际分组字段名factor_var。 tukey_hsd()运行时会在返回结果的属性中记录分组变量的名称为grouping_variable,后续add_xy_position()读取该属性尝试匹配数据列时,找不到对应名称的列,就会抛出不存在该列的报错。- 额外错误点:调用自定义函数时直接传入
dat$num_var、dat$factor_var格式的向量,不符合tidy评估的传参规则,会进一步干扰变量名识别。
解决方法
使用tidy evaluation的{{ }}(双大括号运算符)处理变量传递,同时动态构造公式,调整后的自定义函数如下:
make_tukey_test <- function (data, variable, grouping_variable){ data %>% tukey_hsd({{variable}} ~ {{grouping_variable}}) }
调用函数时直接传入裸变量名即可,不需要带数据集前缀:
test <- make_tukey_test(data = dat, variable = num_var, grouping_variable = factor_var)
调整后返回的tukey检验结果的分组变量属性会被正确识别为factor_var,后续运行add_xy_position()即可正常执行:
test <- test %>% add_xy_position(x = "factor_var")
如果需要兼容字符串格式的变量名传入,可以用as.formula动态拼接公式:
make_tukey_test <- function (data, variable_str, grouping_variable_str){ formula <- as.formula(paste0(variable_str, "~", grouping_variable_str)) data %>% tukey_hsd(formula) } # 调用示例 test <- make_tukey_test(data = dat, variable_str = "num_var", grouping_variable_str = "factor_var")
内容的提问来源于stack exchange,提问作者Kharon
相关产品推荐
相关产品推荐

