gpt4 book ai didi

r - 使用 tidyeval 为 "lm"编程一个函数

转载 作者:行者123 更新时间:2023-12-04 14:06:19 26 4
gpt4 key购买 nike

我正在尝试使用 tidyeval(非标准评估)围绕“lm”编写一个函数。使用基础 R NSE,它可以工作:

lm_poly_raw <- function(df, y, x, degree = 1, ...){
lm_formula <-
substitute(expr = y ~ poly(x, degree, raw = TRUE),
env = list(y = substitute(y),
x = substitute(x),
degree = degree))
eval(lm(lm_formula, data = df, ...))
}

lm_poly_raw(mtcars, hp, mpg, degree = 2)

但是,我还没有弄清楚如何使用 tidyeval 来编写这个函数。和 rlang .我假设 substitute应更换为 enquo ,并由 !! 评估. Hadley 的 Adv-R 中有一些提示,但我无法弄清楚。

最佳答案

这是将来可能会在 rlang 中出现的那种公式构造函数:

f <- function(x, y, flatten = TRUE) {
x <- enquo(x)
y <- enquo(y)

# Environments should be the same
# They could be different if forwarded through dots
env <- get_env(x)
stopifnot(identical(env, get_env(y)))

# Flatten the quosures. This warns the user if nested quosures are
# found. Those are not supported by functions like lm()
if (flatten) {
x <- quo_expr(x, warn = TRUE)
y <- quo_expr(y, warn = TRUE)
}

new_formula(x, y, env = env)
}

# This can be used for unquoting symbols
var <- "cyl"
lm(f(disp, am + (!! sym(var))), data = mtcars)

棘手的部分是:
  • 如果通过 ... 的不同层转发,LHS 和 RHS 可能来自不同的环境。 .我们需要检查一下。
  • 我们需要检查用户没有取消引用 quosures。 lm()和 co 不支持这些。 quo_expr()压平所有 quosures,如果找到一些,则可选地发出警告。
  • 关于r - 使用 tidyeval 为 "lm"编程一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46867888/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com