使用mutate+across结合case_when动态应用条件时出现递归错误的排查
问题原因与解决方法
错误根源
- 列表提取方式错误:你用
case_when_exprs[cur_column()]提取的是子列表(而非列表内的表达式集合),!!!展开子列表会导致case_when接收到错误的参数结构,触发递归求值冲突。 .data引用上下文冲突:在across的匿名函数中,.data指向整个数据框的mask,直接使用.data会和当前正在求值的列promise产生递归引用。
修正代码
步骤1:调整表达式中的列引用
将表达式里的.data替换为across匿名函数中代表当前列的.x:
case_when_exprs <- list("value" = rlang::exprs(.x == "a" ~ "A", TRUE ~ .x))
步骤2:正确提取表达式并展开
用[[而非[提取列表内的表达式集合,确保!!!能正确展开case_when的条件对:
df <- tibble(value=c("a","b","c")) # 动态调用成功运行 df %>% mutate(across(names(case_when_exprs), ~ case_when(!!!case_when_exprs[[cur_column()]])))
验证结果
运行后输出符合预期:
# A tibble: 3 × 1 value <chr> 1 A 2 b 3 c
内容的提问来源于stack exchange,提问作者Julio
相关产品推荐
相关产品推荐

