Важным «скрытым» аспектом формул является связанная с ними среда.
Когда создается form_obj
, его среда устанавливается на то место, где было создано form_obj
:
environment(form_obj)
# <environment: R_GlobalEnv>
Для любой другой версии среда формулы создается из with()
и задается для этой временной среды. Проще всего это увидеть с помощью подхода as.formula
, разбив его на несколько шагов:
with(mtcars, {
f = as.formula(text_obj)
print(environment(f))
lm(f)
})
# <environment: 0x7fbb68b08588>
Мы можем заставить подход form_obj
работать, отредактировав его среду перед вызовом lm
:
with(mtcars, {
# set form_obj's environment to the current one
environment(form_obj) = environment()
lm(form_obj)
})
Страница справки для ?formula
немного длинная, но есть раздел о средах:
Среды
У объекта формулы есть связанная среда, и эта среда (а не родительская среда) используется model.frame
для оценки переменных, которые не найдены в предоставленном аргументе данных.
Формулы, созданные с помощью оператора ~
, используют среду, в которой они были созданы , Формулы, созданные с помощью as.formula
, будут использовать аргумент env
для своей среды.
В результате, если формула с ~
помещает часть среды "под ковер" - в более общие настройки, безопаснее использовать as.formula
, что дает вам более полный контроль над средой, к которой применяется формула.
Вы также можете проверить главу Хэдли о средах:
http://adv-r.had.co.nz/Environments.html