在匿名函数内的公式内使用quasure

Joe*_*Joe 4 r purrr quosure

我正在尝试使用quores来传递自定义函数中的变量名以进行数据处理和在公式中使用,但是在公式中使用quosures是不正确的。有没有更好的方法可以在公式中取消引号的引用?

library(dplyr)
library(broom)
library(purrr)
library(tidyr)

foo <- function(mydata, dv, iv, group_var) {
  dv = enquo(dv)
  iv = enquo(iv)
  group_var = enquo(group_var)

  mydata <- mydata %>% 
    group_by(!!group_var) %>% 
    nest() 

  mydata %>% 
    mutate(model = map(data, 
      ~summary(lm(formula(substitute(dv ~ iv)), data = .))
    )) %>%         
    unnest(model %>% map(tidy))
}

foo(mydata=mtcars, dv=mpg, iv=wt, group_var=cyl)
Run Code Online (Sandbox Code Playgroud)

我的代码产生“ mutate_impl(.data,点)中的错误:评估错误:对象不是矩阵。”

这是我要制作成函数的代码的工作版本:

mtcars %>% 
  group_by(cyl) %>% 
  nest() %>% 
  mutate(model = map(data, ~summary(lm(mpg ~ wt, data = .)))) %>% 
  unnest(model %>% map(tidy))
Run Code Online (Sandbox Code Playgroud)

ngm*_*ngm 6

可以说,您需要使用基R的非标准评估以及诸如lm“不在tidyverse”之类的函数。

因此,您可以将其更改为:

foo <- function(mydata, dv, iv, group_var) {
  flma <- as.formula(paste(substitute(dv), "~", substitute(iv)))
  group_var = enquo(group_var)

  mydata <- mydata %>% 
    group_by(!!group_var) %>% 
    nest() 

  mydata %>% 
    mutate(model = map(data, ~summary(lm(flma, data = .)))) %>%         
    unnest(model %>% map(tidy))
}   

foo(mtcars, mpg, wt, cyl)
Run Code Online (Sandbox Code Playgroud)

如果您知道您只是在做简单的回归,那很好。为了获得更大的灵活性,只需直接传递公式即可,如下所示:

foo2 <- function(mydata, flma, group_var) {
  group_var = enquo(group_var)

  mydata <- mydata %>% 
    group_by(!!group_var) %>% 
    nest() 

  mydata %>% 
    mutate(model = map(data, ~summary(lm(flma, data = .)))) %>%         
    unnest(model %>% map(tidy))
}   

foo(mtcars, mpg ~ wt, cyl)
Run Code Online (Sandbox Code Playgroud)