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

向含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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 15:42:11