Почему использование with () в качестве функции в вызове map () не работает в этом примере? - PullRequest
3 голосов
/ 29 апреля 2019
library(tidyverse)

formulas <- list(
  mpg ~ disp,
  mpg ~ I(1 / disp),
  mpg ~ disp + wt,
  mpg ~ I(1 / disp) + wt
)

# this works
map(formulas, ~ {lm(.x, mtcars)}) 

# this doesn't
map(formulas, ~ {with(mtcars, lm(.x))}) 

 Error in eval(predvars, data, env) : object 'disp' not found 

Прорабатывая упражнения в https://adv -r.hadley.nz / functionals.html # упражнения-28 , я пытался решить упражнение № 6, пытаясь оценить lm()внутри mtcars окружения с with(), но выдает ошибку.

Почему не работает последний вызов?

1 Ответ

1 голос
/ 29 апреля 2019

Это проблема окружающей среды. Одним из вариантов будет quote компонентов, чтобы он не был выполнен

formulas <- list(
  quote(mpg ~ disp),
  quote(mpg ~ I(1 / disp)),
   quote(mpg ~ disp + wt),
  quote(mpg ~ I(1 / disp) + wt)
  )

out1 <- map(formulas, ~ with(mtcars, lm(eval(.x))))
out1
#[[1]]

#Call:
#lm(formula = eval(.x))

#Coefficients:
#(Intercept)         disp  
#   29.59985     -0.04122  


#[[2]]

#Call:
#lm(formula = eval(.x))

#Coefficients:
#(Intercept)    I(1/disp)  
#      10.75      1557.67  


#[[3]]

#Call:
#lm(formula = eval(.x))

#Coefficients:
#(Intercept)         disp           wt  
#   34.96055     -0.01772     -3.35083  


#[[4]]

#Call:
#lm(formula = eval(.x))

#Coefficients:
#(Intercept)    I(1/disp)           wt  
#     19.024     1142.560       -1.798  

Он также должен работать с первым методом

out2 <- map(formulas, ~ lm(.x, mtcars))

Там будут небольшие изменения в атрибутах и ​​в call, но если это игнорируется,

out1[[1]]$call <- out2[[1]]$call
all.equal(out1[[1]], out2[[1]], check.attributes = FALSE)
#[1] TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...