Я пишу пользовательскую функцию, которая строит линию сглаживания и отображает подзаголовок как «линейную модель» только тогда, когда все параметры geom_smooth
являются линейными (то есть method = "lm"
и formula = y ~ x
). Это включает в себя проверку того, что пользователь вводит для этих двух аргументов. Сложный аспект проверки ввода заключается в том, что аргумент method
можно ввести либо как символ ("lm"
), либо как функцию (MASS::rlm
), и именно здесь функция дает сбой.
Как я могу заставить это работать?
Вот reprex
:
# for reproducibility
set.seed(123)
library(tidyverse)
library(mgcv)
# defining a function to plot smooth line
scatter_lm <- function(df, x, y, formula = y ~ x, method = "lm") {
if (as.character(deparse(formula)) != "y ~ x" ||
!any(method %in% c("lm", stats::lm))) {
subtitle <- "non-linear model"
} else {
subtitle <- "linear model"
}
# creating the plot
ggplot(df, aes(!!rlang::enquo(x), !!rlang::enquo(y))) +
geom_smooth(formula = formula, method = method) +
labs(subtitle = subtitle)
}
# different `formula` (works)
scatter_lm(mtcars, wt, mpg, y ~ log(x))
# `method` entered as a character (works)
scatter_lm(mtcars, wt, mpg, y ~ x, "gam")
# `method` entered as a function (doesn't work)
scatter_lm(mtcars, wt, mpg, y ~ x, MASS::rlm)
#> Error in match(x, table, nomatch = 0L): 'match' requires vector arguments
Created on 2019-05-30 by the reprex package (v0.3.0)
это решение немного запутанное, но оно работает:
scatter_lm <- function(df, x, y, formula = y ~ x, method = "lm") {
a <- paste(deparse(method), collapse = "")
if (as.character(deparse(formula)) != "y ~ x" ||
if (class(method) == "function") {
a != paste(deparse(lm), collapse = "")
} else method != "lm") {
subtitle <- "non-linear model"
} else {
subtitle <- "linear model"
}
#creating the plot
ggplot(df, aes(!!rlang::enquo(x), !!rlang::enquo(y))) +
geom_smooth(formula = formula, method = method) +
labs(subtitle = subtitle)
}