不能在r中的lm()函数中使用非标准评估

问题描述 投票:0回答:1

我想使用

mylm
包中的非标准化评估(NSE)编写一个自定义函数
rlang
,它应该输出与直接运行
lm(cyl~ mpg, data = mtcars)
相同的结果。

但是我尝试了两种不同的方法NSE都是报错,如何才能成功运行

mylm
函数。

我知道我可以使用

reformatele ()
函数在
formula
函数中构造
mylm
,但我想知道是否可以使用
{{}}
!!
inject()
来使
mylm
成功运行。

# use{{}} for NSE
mylm <- function(y, x, data) {
  lm({{ y }}, {{ x }}, data = data)
}

# use inject for NSE
mylm(cyl, mpg, data = mtcars)
#> Error in eval(expr, envir, enclos): object 'cyl' not found

mylm2 <- function(y, x, data) {
  rlang::inject(lm({{ y }}, {{ x }}, data = data))
}

mylm2(cyl, mpg, data = mtcars)
#> Error in xj[i]: invalid subscript type 'language'

创建于 2023-12-15,使用 reprex v2.0.2

r dplyr metaprogramming rlang nse
1个回答
0
投票

我遇到了类似的问题,对我来说,最好的解决方法是使用:

mylm <- function(y, x, data) {
  lm(data[[y]] ~ data[[x]], data = data)
}

mylm("cyl", "mpg", data = mtcars)
#> 
#> Call:
#> lm(formula = data[[y]] ~ data[[x]], data = data)
#> 
#> Coefficients:
#> (Intercept)    data[[x]]  
#>     11.2607      -0.2525

创建于 2023-12-15,使用 reprex v2.0.2

这适合您的用例吗?或者您出于其他原因想要/需要使用 NSE?

© www.soinside.com 2019 - 2024. All rights reserved.