R语言dplyr管道外传入mutate自定义计算函数问题求解
可行解决方案
你遇到的报错核心原因有两点:
- 调用
apply.method(myfun = external_function1())时,external_function1()会在全局环境立刻执行,此时全局环境不存在x/y变量,还没进入mutate的执行环境就已经报错 - 即使改为传递函数本身,外部函数的默认执行环境是定义时的全局环境,无法识别
mutate掩码内的数据框变量
注:原示例代码中
my.df的x列长度为100、y列长度为200,会触发数据框长度不匹配报错,以下示例统一修正为等长列。
方案1:rlang表达式注入(最贴合你的预期写法)
不需要修改你原有调用逻辑,仅需调整外部函数返回未计算的表达式,在mutate内注入执行即可:
library(dplyr) library(rlang) my.df <- data.frame(x = rnorm(100), y = rnorm(100)) # 外部函数返回未计算的表达式 external_function1 <- function(){ expr(x + y) } external_function2 <- function(constant){ # 常量参数用!!提前注入到表达式中 expr(x * y + !!constant) } apply.method <- function(myfun = NULL) { my.df %>% # 用!!把表达式注入到mutate的执行环境中计算 mutate(z = !!myfun) } # 调用方式和你原写法完全一致 output1 <- apply.method(myfun = external_function1()) output2 <- apply.method(myfun = external_function2(constant = 3))
最终output1的计算效果完全等价于mutate(z = x + y)。
方案2:显式传递数据参数(无额外依赖,更稳定)
如果不想处理非标准评估的环境问题,可以让外部函数显式接收数据作为参数,写法更稳妥:
library(dplyr) my.df <- data.frame(x = rnorm(100), y = rnorm(100)) external_function1 <- function(df){ df$x + df$y } external_function2 <- function(df, constant){ df$x * df$y + constant } apply.method <- function(myfun = NULL, ...) { my.df %>% # .data指代当前管道传递的数据框,额外参数通过...传递 mutate(z = myfun(.data, ...)) } # 调用时传递函数本身,额外参数直接传入即可 output1 <- apply.method(myfun = external_function1) output2 <- apply.method(myfun = external_function2, constant = 3)
内容的提问来源于stack exchange,提问作者Apriconer
相关产品推荐
相关产品推荐

