Возможно ли использовать оператор оценки rlang tidy {{ внутри формулы lm?

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

my_scatter <- function(df, xvar, yvar) {
     ggplot(df) +
          geom_point(aes(x = {{xvar}}, y = {{yvar}}))
}

my_scatter(mpg, cty, hwy) 

Но мне интересно, есть ли способ сделать аналогичный вызов внутри формул, например, внутри lm():

my_lm <- function(df, yvar, xvar) {
     lm({{yvar}} ~ {{xvar}} , data = df)
}

my_lm(mpg, cty, hwy) 

user11151932

Ответов: 2

Ответы (2)

Пара нюансов. Во-первых, {{> обычно поддерживается только в функциях, управляемых tidyverse. Грядущая функция rlang::inject() позволит вам расширить эту поддержку на произвольные функции.

Во-вторых, {{ - это сокращение для !!enquo(), которое фиксирует выражение, передаваемое функции, и окружение, в котором это выражение должно быть оценено. Поскольку окружение уже предоставлено рамкой данных df, лучше использовать глагол ensym(), который фиксирует только символ.

Следующее работает с rlang 0.4.10:

my_lm <- function(df, yvar, xvar) {
    ysym <- rlang::ensym(yvar)
    xsym <- rlang::ensym(xvar)
    rlang::inject( lm(!!ysym ~ !!xsym, data=df) )
}

my_lm(mpg, cty, hwy)

lm ожидает объект формулы, который вы можете построить с помощью reformulate/as.formula.

my_lm <- function(df, yvar, xvar) {
  lm(reformulate(xvar, yvar), data = df)
}

my_lm(mpg, 'cty', 'hwy') 

2022 WebDevInsider