Разница между assign (..., envir = ...) и средой (...) = - PullRequest
7 голосов
/ 26 декабря 2011

В чем разница между назначением значения имени в среде и настройкой среды переменной?Я не могу понять это из документации.

например:

MyTestFunc = function(x)
{
    myVal = "abcde"

    # what is this doing?  why is myVal not in the global environment after 
    # this call? I see it adds an environment attribute to the variable, 
    # but what good is that?
    environment(myVal) = globalenv()

    assign( "myVal" , myVal , envir = globalenv() )

    # this seems to copy graphics:::rect to the current environment which seems 
    # to contradict the behavior of environment( myVal ) above
    environment( rect ) = environment()

    # this seems to do the same thing
    assign( "rect" , rect , envir = globalenv() )
}

# this prints out rect, but shows <environment: namespace: graphics>!
rect

Ответы [ 2 ]

6 голосов
/ 27 декабря 2011

Функция назначения просто связывает имя со значением в указанной среде.

Но функция замены среды делает две вещи: ее основная цель - изменить среду закрытия функции. В этой среде код тела функции ищет глобальные переменные и функции. Обычно это среда, в которой была определена функция (поэтому, если вы определите ее в командной строке, она будет использовать globalenv). В качестве «бонуса» он просто назначает атрибут .Environment для других типов объектов. Это довольно бесполезно для большинства объектов, но - это , используемый формулами.

Во-вторых, это работает как любая другая функция замены: если имя существует в текущей среде, оно изменяет его напрямую, в противном случае создает локальную копию и изменяет ее. Так что в вашем случае он создает локальную копию функции rect и меняет свою среду. Исходная функция остается без изменений.

# showing names replacement behavior
f <- function() {
  names(letters) <- LETTERS
  letters # the local modified copy
}
f() # prints changed letters
letters # unchanged
1 голос
/ 26 декабря 2011

Внутри функции, которую вы просили и выполняли:

 # what is this doing?  why is myVal not in the global environment after this call?
    # I see it adds an environment attribute to the variable, but what good is that?
    environment(myVal) = globalenv()

Таким образом, вы ничего не сделали с myVal объектом с именем "abcde", который был в функции. Вместо этого вы создали новую среду с именем «abcede» внутри среды функции. Затем вы выполнили:

assign( "myVal" , myVal , envir = globalenv() )

Он создал переменную с именем «myVal» со ​​значением символьного режима «abcde», полученную из среды локальных функций, и поместил ее в глобальную среду. Теперь у него есть атрибут с именем ".Environment". Тем не менее, остается неясным, каковы ваши цели, поскольку среды предназначены для определения области действия функций . Назначение среды для объекта данных просто странно. Переменные находятся в средах, но не представляется полезной установка окружения для переменной . Поэтому я думаю, что ответ на ваш вопрос: ... что это хорошего? "Должен быть" это не хорошо ".

...