3

我在弄清楚准引用时遇到了一些麻烦,特别是我有一个函数,它接受一个参数,该参数指定哪个变量应该进入模型,然后在 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引用嵌套 tibble 中的值的事实有关data,我一直在四处寻找,rlang::qq_show()但到目前为止还没有弄明白

4

1 回答 1

2

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

于 2018-11-02T14:21:27.267 回答