использование соответствия для проверки объектов символов и типов функций - PullRequest
0 голосов
/ 30 мая 2019

Я пишу пользовательскую функцию, которая строит сглаживающую линию и отображает субтитры в виде «линейной модели», только когда все параметры 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

Создано в 2019-05-30 пакетом Представления (v0.3.0)

1 Ответ

4 голосов
/ 31 мая 2019

это решение немного запутанное, но оно работает:

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)
}
...