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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:15:02