在 purrr:map 调用中使用函数的准引号参数
Using a quasiquoted argument to a function within a purrr:map call
我在弄清楚准引用时遇到了一些麻烦,特别是我有一个函数,它接受一个参数,该参数指定哪个变量应该进入一个模型,然后 运行 在 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()
但至今没弄明白'
enquo()
将尝试跟踪您传入的符号的环境,但您并不真的希望将其包含在您传递给 lm
的公式中。最好将其捕获为符号而不是 quosure。试试这个
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
我在弄清楚准引用时遇到了一些麻烦,特别是我有一个函数,它接受一个参数,该参数指定哪个变量应该进入一个模型,然后 运行 在 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()
但至今没弄明白'
enquo()
将尝试跟踪您传入的符号的环境,但您并不真的希望将其包含在您传递给 lm
的公式中。最好将其捕获为符号而不是 quosure。试试这个
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