Использование квазицитированного аргумента для функции в вызове purrr: map - PullRequest
0 голосов
/ 02 ноября 2018

У меня небольшие проблемы с вычислением квази-цитаты, в частности, у меня есть функция, которая принимает аргумент, который уточняет, какая переменная должна войти в модель, которая затем запускается в вызове purrr :: map.

Я работал с: https://dplyr.tidyverse.org/articles/programming.html

# libs
library(tidyverse)
library(broom)
# dummy data
df <- data.frame(
    "a"=rep(c("alpha","beta"),50),
    "b"=rnorm(100),
    "value1"=rnorm(100),
    "value2"=rnorm(100)
)

model <- function(var) {
    var <- enquo(var)
    df %>%
        group_by(a) %>%
        nest() %>%
        mutate(model=map(data, ~ lm(b ~ (!! var),data=.)))
}

model(value1)

> Error in mutate_impl(.data, dots) : Evaluation error: invalid model formula.

вставка имени напрямую работает как ожидалось:

df %>%
    group_by(a) %>%
    nest() %>%
    mutate(model=map(data, ~ lm(b ~ value1,data=.))) %>%
    unnest(model %>% map(glance))

Я могу использовать !! var внутри функции:

modelX <- function(var,df=df) {
    var <- enquo(var)
    df %>%
        select(!! var)
}

modelX(value1,df) 

Я предполагаю, что это как-то связано с тем фактом, что !! var ссылается на значение во вложенном теге data, я возился с rlang::qq_show(), но не смог понять это до сих пор '

1 Ответ

0 голосов
/ 02 ноября 2018

enquo() будет пытаться отследить окружающую среду символа, который вы передаете, но вы не хотите, чтобы он был включен в формулу, которую вы передаете lm. Было бы лучше зафиксировать это как символ, а не как выражение. Попробуйте это

model <- function(var) {
  var <- ensym(var)
  df %>%
    group_by(a) %>%
    nest() %>%
    mutate(model=map(data, ~ lm(b ~ !!var, data=.)))
}

работал у меня с dplyr_0.7.6 и purrr_0.2.5

...