在dplyr::mutate_at()中内联定义自定义函数的报错原因求解
报错原因解析
你对dplyr中~开头的purrr风格匿名函数简写语法存在误用:
- dplyr的列修改类函数(包括mutate、mutate_at等)支持以
~开头快速定义匿名函数,公式内部的.指代当前传入的目标列向量。 - 你写的
~ function(x1 = ., x2 = 100) return(x1 + x2)逻辑等价于:用~定义了一个匿名函数,这个函数的返回值是另一个未执行的函数对象,而非计算后的数值向量。mutate尝试将函数对象赋值给Sepal.Length列时,就触发了「列必须是向量,不能是函数」的报错。
符合要求的正确写法
如果要求自定义函数完全在mutate_at()内部定义,有两种实现方式:
- 直接用
~简写逻辑,不需要额外套function定义:
library(dplyr) data(iris) iris %>% mutate_at('Sepal.Length', ~ . + 100)
- 如果需要显式定义函数结构,写完函数后要立即传入参数执行,返回计算结果:
library(dplyr) data(iris) iris %>% mutate_at('Sepal.Length', ~ (function(x1, x2 = 100) { return(x1 + x2) })(x1 = .))
内容的提问来源于stack exchange,提问作者Brian Smith
相关产品推荐
相关产品推荐

