Использование квазицитированного аргумента для функции в вызове purrr:map
У меня возникли небольшие проблемы с вычислением квази-цитаты, в частности, у меня есть функция, которая принимает аргумент, который указывает, какая переменная должна входить в модель, которая затем запускается в вызове 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 ответ
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