如何将变量从 lm 对象传递给 aes(x =, y = )?

How to pass variables from lm object to aes(x =, y = )?

Context: 我有一个函数,它将使用 stats::lm() 创建的对象作为其主要参数。此函数的目标是仅使用此 lm 对象制作 ggplots。 警告:模型中使用的变量不是函数的参数如果模型是lmobj <- lm(y ~ x, data = df)那么函数只需要lmobj 作为参数。它确实不同于 。此外,我不是在寻找采用原始数据并计算回归线和散点图的“仅 ggplot”解决方案(例如 ggplot2::geom_smooth(method = "lm"))。

问题: ggplot() geom 函数有一个 xy 参数需要不带引号的变量(参见 reference manual) ;我怎样才能从 lmobj 恢复这些?

预期输出:

library(ggplot2)
lmobj <- lm(Petal.Width ~ Petal.Length, data = iris)
myfun <- function(.lm) {
  # make a scatterplot with .lm using ggplot
  ggplot(data = .lm[["model"]], aes(x = Petal.Width, y = Petal.Length)) +
    geom_point()
}
myfun(lmobj)

尝试与错误

我试图使用 cat():

lmobject 中获取一个不带引号的变量名
> cat(names(lmobj[["model"]][2]))
Petal.Length

但它会产生一个错误:

> myfuntest <- function(.lm) {
+   # make a scatterplot with .lm using ggplot
+   ggplot(data = .lm[["model"]], aes(x = cat(names(.lm[["model"]][2])), 
+                                     y = cat(names(.lm[["model"]][1])))) +
+     geom_point()
+ }
> myfuntest(lmobj)
Petal.LengthPetal.WidthPetal.LengthPetal.WidthError: geom_point requires the following missing aesthetics: x and y

一种方法是首先将 aes 的参数评估为符号,然后通过将其包装到 do.call

中来调用 aes
myfun <- function(.lm) {
  ggplot(data = .lm[["model"]],
         do.call(aes, list(x = sym(names(.lm[["model"]])[2]),
                           y = sym(names(.lm[["model"]])[1])))) +
    geom_point()
}

以下作品:

myfun <- function(model) {
  coefs <- names(model$model)
  ggplot(data = model$model) +
    aes(x = !! rlang::sym(coefs[1L]), y = !! rlang::sym(coefs[2L]))) +
    geom_point()
}

这里的相关点是 aes 使用 ‘rlang 的 tidy 评估,因此要求参数是 injected via !! 作为名称。