Формула возврата в родительскую среду

#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() также было бы неплохо, если вы всегда предпочитаете глобальную среду.