Как изменить часть аргумента формулы при переносе моделей в tidyeval? - PullRequest
0 голосов
/ 19 октября 2018

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

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)

1 Ответ

0 голосов
/ 19 октября 2018

ensym() должен позволить вам захватить символ, предоставленный функции.

ensym() и ensyms() - варианты enexpr() и enexprs(), которые проверяют, что захваченное выражение либострока (которую они преобразуют в символ) или символ.Если что-то еще предоставляется, они выдают ошибку.

source

run_model3 <- function (df, dep_str, ...) {
  dep_str <- ensym(dep_str)
  groupers <- enquos(...)
  formula <- dep_str %>% str_c("~ cty") %>% as.formula()
  df %>%
    group_by(!!!groupers) %>%
    do(model = lm(formula, data = .))
}

> run_model3(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_model1:

> run_model3(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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...