Если мы хотим передать аргументы отдельно в «my_ttest» и построить формулу внутри функции, преобразуем выражение (enquo
) в символ (sym
) для обоих переменных: «by», затемсоздайте выражение ('expr1') и eval
uate` it
my_ttest <- function(df, variable, by, env = parent.frame()){
variable <- rlang::sym(rlang::as_label(rlang::enquo(variable)))
by <- rlang::sym(rlang::as_label(rlang::enquo(by)))
exp1 <- rlang::expr(!! variable ~ !! by)
t.test(formula = eval(exp1), data = df)
}
my_ttest(mtcars, mpg, am)
#Welch Two Sample t-test
#data: mpg by am
#t = -3.7671, df = 18.332, p-value = 0.001374
#alternative hypothesis: true difference in means is not equal to 0
#95 percent confidence interval:
# -11.280194 -3.209684
#sample estimates:
#mean in group 0 mean in group 1
# 17.14737 24.39231
Или, как упомянуто в комментариях @lionel, это можно сделать напрямую с помощью ensym
my_ttest <- function(df, variable, by, env = parent.frame()){
exp1 <- expr(!!ensym(variable) ~ !!ensym(by))
t.test(formula = eval(exp1), data = df)
}
my_ttest(mtcars, mpg, am)
РЕДАКТИРОВАТЬ: На основе комментариев @ lionel