Rlang gerando modelos de todas as combinações

Após assistir ao vídeo da curso-r sobre rlang fiquei com dúvida sobre como gerar um modelo de lm() com todas as combinações de duas em duas das colunas do mtcars, segue abaixo um esquema:

#Exemplo para mpg~ e todas as colunas, isto aqui está ok
nomes2 ← names(mtcars)[-1] %>% syms()
form2 ← map(nomes2, ~expr(!!sym(names(mtcars[1]))~!!.x))
map(form2, lm, data=mtcars)

#Geração do modelo com todas as combinações das variáveis
nomes3 ← names(mtcars)[-1] %>% syms()
x1 ← combn(nomes3, m = 2, simplify = F)

paste(x1)

#não consegui pegar as combinações do x1 e fazer cyl~disp, gear~carb, etc para então gerar os modelos como em map(form2, lm, data=mtcars)

Pedro,

Sua intuição está correta. Acho que só faltou conhecer a função purrr::cross():

library(purrr)
library(rlang)

modelos <- mtcars %>%
  names() %>%
  list(., .) %>%
  cross(`==`) %>%
  map(paste, collapse = " ~ ") %>%
  map(parse_expr) %>%
  map(lm, data = mtcars)

length(modelos)
#> [1] 110

Created on 2021-10-20 by the reprex package (v2.0.1)


Eu sempre gosto de dar dicas para ajudar as pessoas a melhorarem seus códigos. Tenho duas sugestões para você:

  1. Normalmente não é uma boa usar o pipe para chamar só uma função. No caso da sua primeira linha, por exemplo, acho que syms(names(mtcars)[-1]) ficaria melhor.

  2. Ao fazer uma pergunta, use o pacote reprex, pois isso facilita muito para quem está lendo. Se quiser saber mais, você pode ler a template de pergunta do próprio Discourse ou ver o vídeo da Bea Milz: R + Reprex - YouTube.

1 curtida