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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 23:55:04