Используя нестандартную оценку с формулой

Я создаю пакет, который использует нестандартную оценку для отслеживания значения столбцов. Пакет передает фрейм данных среди функций, которые разными способами выполняют один и тот же набор столбцов. Нестандартная оценка отлично подходит для этого:

my_select <- function(df, xcol, ycol) {
    new_df <- dplyr::select(df, !!xcol, !!ycol)
    new_df
}
my_select(mtcars, quo(wt), quo(mpg))

Тем не менее, я хотел бы функцию, которая работает с формулой:

my_lm <- function(df, xcol, ycol) {
    new_lm <- lm(!!xcol, !!ycol, data=df)
    new_lm
}
my_lm(mtcars, quo(wt), quo(mpg)

возвращается Error in !xcol : invalid argument type, Я перепробовал все виды комбинаций quo(), enquo(), а также !!, но основная проблема в том, что я не знаю, какой объект lm необходимо.

1 ответ

Вы можете создать формулу, вставив значения уравнения вместе, а затем передать формулу lm, Я уверен, что есть лучший способ сделать это, но вот один рабочий подход:


library(rlang)

my_lm <- function(df, xcol, ycol) {
  form <- as.formula(paste(ycol, " ~ ", xcol)[2])
  my_lm <- lm(form, data=df)
  my_lm
}

my_lm(mtcars, quo(wt), quo(mpg))
#> 
#> Call:
#> lm(formula = form, data = mtcars)
#> 
#> Coefficients:
#> (Intercept)           wt  
#>      37.285       -5.344

@zlipp дал рабочий ответ, но вот более обновленная версия

my_lm <- function(df, xcol, ycol) {
  xcol_e <- rlang::enquo(xcol)
  ycol_e <- rlang::enquo(ycol)
  form <- paste0(rlang::as_label(ycol_e), "~", rlang::as_label(xcol_e))
    new_lm <- lm(form, data=df)
    new_lm
}
my_lm(mtcars, wt, mpg)

Использование rlang вместо paste

my_lm <- function(.df, xcol, ycol) {
  form <- rlang::new_formula(rlang::ensym(ycol), rlang::ensym(xcol)) 
  new_lm <- lm(form, data=.df) 
  new_lm
}
my_lm(mtcars, wt, mpg)
Другие вопросы по тегам