如何将变量从 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 函数有一个 x
和 y
参数需要不带引号的变量(参见 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 !!
作为名称。
Context: 我有一个函数,它将使用 stats::lm()
创建的对象作为其主要参数。此函数的目标是仅使用此 lm
对象制作 ggplots。 警告:模型中使用的变量不是函数的参数即如果模型是lmobj <- lm(y ~ x, data = df)
那么函数只需要lmobj
作为参数。它确实不同于 ggplot2::geom_smooth(method = "lm")
)。
问题: ggplot()
geom 函数有一个 x
和 y
参数需要不带引号的变量(参见 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 !!
作为名称。