为何across仅在函数内与coalesce结合使用时有效?
为什么自定义
coacross可用但直接写coalesce(!!!across(...))报错? 先看你定义的函数:
coacross <- function(...) { coalesce(!!!across(...)) }
在mutate中调用它能正常运行:
aa = tibble(a1 = c(NA, 1), a2 = c(2, NA), b = 3:4) %>% mutate(a_full = coacross(starts_with('a')))
但直接写下面的代码就报错:
aa %>% mutate(c = coalesce(!!!across(starts_with('a'))))
报错信息:
Error in `across()`: ! Must only be used inside data-masking verbs like `mutate()`, `filter()`, and `group_by()`.
核心原因:求值环境的差异
自定义函数场景:
当coacross在mutate内部被调用时,mutate作为数据掩码动词,会把当前数据框的上下文(数据掩码环境)传递给coacross内部的代码。across在这个环境里被执行,能正常识别starts_with('a')这类选择器,返回对应列的向量,再通过!!!展开给coalesce,整个流程顺畅。直接调用场景:
coalesce是普通的向量处理函数,它不会创建或提供数据掩码环境。当你把across(starts_with('a'))直接放在coalesce的参数里时,across找不到它运行必需的“数据掩码上下文”——它不知道当前要处理的是哪个数据框,自然无法解析列选择器,所以触发报错。
简单说:自定义函数在mutate里调用时,内部的across能“蹭到”mutate的掩码环境;而直接把across塞给非掩码函数,它就没环境可用了。
内容的提问来源于stack exchange,提问作者Juan C
相关产品推荐
相关产品推荐

