Насколько я видел, есть два способа работы с аргументами формулы, когда вы хотите создать функции, которые обертывают модели.Вы можете вставить строковые версии формулы вместе:
library(tidyverse)
run_model1 <- function(df, dep_str, ...){
groupers <- enquos(...)
formula <- dep_str %>% str_c("~ cty") %>% as.formula()
df %>%
group_by(!!!groupers) %>%
do(model = lm(formula, data = .))
}
или вы можете процитировать всю формулу целиком:
run_model2 <- function(df, formula, ...){
groupers <- enquos(...)
formula <- enexpr(formula)
df %>%
group_by(!!!groupers) %>%
do(model = lm(!!formula, data = .))
}
, которые на самом деле позволяют мне получать сгруппированные модели, варьируяпеременная в формуле.
run_model1(mpg, "hwy", cyl)
#> Source: local data frame [4 x 2]
#> Groups: <by row>
#>
#> # A tibble: 4 x 2
#> cyl model
#> * <int> <list>
#> 1 4 <S3: lm>
#> 2 5 <S3: lm>
#> 3 6 <S3: lm>
#> 4 8 <S3: lm>
run_model2(mpg, hwy ~ cty, cyl)
#> Source: local data frame [4 x 2]
#> Groups: <by row>
#>
#> # A tibble: 4 x 2
#> cyl model
#> * <int> <list>
#> 1 4 <S3: lm>
#> 2 5 <S3: lm>
#> 3 6 <S3: lm>
#> 4 8 <S3: lm>
Однако первое требует неуклюжего смешивания аргументов в кавычках и без кавычек и особенно не работает, если я хочу получить доступ к версии символа для использования позже.Вторая заставляет меня указывать всю формулу каждый раз, когда я предпочитаю указывать только одну часть.
В принципе, как я могу получить функцию, которая будет принимать аргументы, подобные этой?
run_model3(mpg, hwy, cyl)