#r #attributes #formula #environment
#r #атрибуты #формула #Окружающая среда
Вопрос:
Если у меня есть функция R, которая возвращает formula
, она привязана к области видимости / среде функции. Что я могу сделать изнутри функции, чтобы возвращаемая формула не имела этого атрибута среды?
Например.,
myfun = function() {
model = y ~ 1
return(model)
}
Результат:
> myfun()
# y ~ 1
# <environment: 0x000001ffd94eca50>
Одним из решений является изменение атрибута перед возвратом:
myfun = function() {
model = y ~ 1
attr(model, ".Environment") = globalenv()
return(model)
}
Но это выглядит банально, так действительно ли это лучший способ?
Комментарии:
1. Для чего вы пытаетесь использовать эту формулу? iirc
lm
и другие в любом случае анализируют формулу и вычисляют в выбранных ими средах, поэтому мне любопытно, когда важна среда формулы2. ах, я должен был дважды проверить. будет редактировать
3. @CalumYou Если вы используете формулу с
lm
и передаете data.frame, вы правы, что это, вероятно, не имеет значения. Но подумайтеfoo <- function() {y <- rnorm(100);lm(myfun())}; foo()
. Это сработает только в том случае, если среда формулы совпадает со средойfoo
функции, а не со средойmyfun
функции.4. Я создаю функцию, которая создает и возвращает (списки) формул, которые пользователь будет использовать в вызывающей среде.
5. @MrFlick Я предполагаю, что это прямо там, в документах, но я никогда не думал использовать lm без аргумента data! Но там сказано: «Если они не найдены в data, переменные берутся из среды (formula), обычно среды, из которой вызывается lm». Итак, хорошо, управление формулой env является довольно ключевым
Ответ №1:
Я мог бы использовать родительскую среду, а не глобальную среду
myfun <- function() {
model <- y ~ 1
environment(model) <- parent.frame()
return(model)
}
Это создаст среду, из которой вы ее вызываете, bit globalenv()
также было бы неплохо, если вы всегда предпочитаете глобальную среду.