Строго говоря, назначение области видимости << - назначить родительской среде или глобальной среде? - PullRequest
0 голосов
/ 22 февраля 2019

Часто родительская среда является глобальной средой.

Но иногда это не так.Например, в функциях внутри функций или в функции ошибок в tryCatch().

Строго говоря, присваивает ли <<- глобальную среду или просто родительскую среду?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Согласно документации:

Операторы <<- и ->> обычно используются только в функциях и вызывают поиск в родительских средах для существующего определения переменной, являющейсяназначены.

Использование этого оператора приведет к тому, что R будет искать в дереве среды, пока не найдет совпадение.Поиск начинается в среде, в которой используется оператор, и оттуда поднимается вверх по стеку.Таким образом, не гарантируется, что это будет «глобальное» присвоение, но может быть.

Как указывает sindri_baldur, если переменная не найдена в какой-либо существующей среде, будет создана новаяна глобальном уровне.

Наконец, я должен отметить, что использование оператора вводит в заблуждение чаще, чем полезно, так как оно нарушает в высокой степени функциональную природу программирования на R.Существует более чем вероятный способ избежать использования <<-.

0 голосов
/ 22 февраля 2019

Попробуйте:

env = new.env()
env2 = new.env(parent = env)

local(x <<- 42, env2)
ls(env)
# character(0)
ls()
# [1] "env"  "env2" "x"

Но:

env$x = 1
local(x <<- 2, env2)
env$x
# [1] 2

… так что <<- делает всю цепочку родительских сред, пока не найдетсуществующий объект с данным именем, и заменяет его.Однако, если он не находит такого объекта, он создает новый объект в .GlobalEnv.

( В документации говорится почти то же самое. Но в таком случае ничегобьет эксперименты, чтобы лучше понять.)

...