我想使用
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
我遇到了类似的问题,对我来说,最好的解决方法是使用:
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?