R中含dplyr的自定义函数内如何向回归模型直接传递预测变量参数
解法1:使用R原生reformulate动态生成公式(无额外依赖、代码最简)
你不需要额外做变量转换或者创建临时数据集,直接用R内置的reformulate函数把字符串形式的预测变量名转换为lm可以识别的公式对象即可,写法如下:
pacman::p_load(tidyverse, broom) data("mtcars") regr_func <- function(.cyl, .pred){ mtcars %>% filter(cyl == .cyl) %>% lm(formula = reformulate(.pred, response = "mpg"), data = .) %>% tidy() %>% mutate(predictor = .pred, cylinders = .cyl) } # 测试调用 regr_func(4, "hp")
运行后返回的结果和你原来的版本完全一致,且term列会直接显示预测变量的真实名称(不会显示为x),更符合使用习惯。
解法2:保留rlang注入写法,用大括号解决管道传参问题
如果你希望继续用rlang的注入语法,不需要创建临时数据集,只要用大括号{}包裹lm的调用步骤,即可自定义管道传递的.的位置,写法如下:
regr_func <- function(.cyl, .pred){ xsym <- rlang::ensym(.pred) mtcars %>% filter(cyl == .cyl) %>% {rlang::inject(lm(mpg ~ !!xsym, data = .))} %>% tidy() %>% mutate(predictor = .pred, cylinders = .cyl) }
这里大括号的作用是打断管道默认的参数传递逻辑,让你可以把过滤后的数据集直接传给lm的data参数,避免inject和管道优先级冲突的问题。
内容的提问来源于stack exchange,提问作者awcm0n
相关产品推荐
相关产品推荐

