Использование предложений в формуле внутри анонимной функции
Я пытаюсь использовать выражения для передачи имен переменных в пользовательской функции для обработки данных и их использования в формуле, но мое использование выражений в формуле неверно. Есть ли лучший способ привести к кавычкам аргументы в формуле?
library(dplyr)
library(broom)
library(purrr)
library(tidyr)
foo <- function(mydata, dv, iv, group_var) {
dv = enquo(dv)
iv = enquo(iv)
group_var = enquo(group_var)
mydata <- mydata %>%
group_by(!!group_var) %>%
nest()
mydata %>%
mutate(model = map(data,
~summary(lm(formula(substitute(dv ~ iv)), data = .))
)) %>%
unnest(model %>% map(tidy))
}
foo(mydata=mtcars, dv=mpg, iv=wt, group_var=cyl)
Мой код выдает "Ошибка в mutate_impl(.data, dots): Ошибка оценки: объект не является матрицей".
Это рабочая версия кода, который я пытаюсь превратить в функцию:
mtcars %>%
group_by(cyl) %>%
nest() %>%
mutate(model = map(data, ~summary(lm(mpg ~ wt, data = .)))) %>%
unnest(model %>% map(tidy))
1 ответ
Решение
Вам необходимо использовать нестандартную оценку Base R с такими функциями, как lm
которые не "в темноте", так сказать.
Таким образом, вы можете изменить вещи на:
foo <- function(mydata, dv, iv, group_var) {
flma <- as.formula(paste(substitute(dv), "~", substitute(iv)))
group_var = enquo(group_var)
mydata <- mydata %>%
group_by(!!group_var) %>%
nest()
mydata %>%
mutate(model = map(data, ~summary(lm(flma, data = .)))) %>%
unnest(model %>% map(tidy))
}
foo(mtcars, mpg, wt, cyl)
Это хорошо, если вы знаете, что делаете только простую регрессию. Для большей гибкости просто передайте формулу напрямую, как в:
foo2 <- function(mydata, flma, group_var) {
group_var = enquo(group_var)
mydata <- mydata %>%
group_by(!!group_var) %>%
nest()
mydata %>%
mutate(model = map(data, ~summary(lm(flma, data = .)))) %>%
unnest(model %>% map(tidy))
}
foo(mtcars, mpg ~ wt, cyl)