Это помогает думать о <<-
как эквивалент assign
(если вы установите параметр inherits
в этой функции TRUE
). Преимущество assign
состоит в том, что он позволяет вам указывать больше параметров (например, окружение), поэтому я предпочитаю в большинстве случаев использовать assign
по сравнению с <<-
.
Использование <<-
и assign(x, value, inherits=TRUE)
означает, что «окружающие среды среды, в которых выполняется доставка, выполняются до тех пор, пока не встретится переменная« x ». Другими словами, он будет продолжать перемещаться по средам, пока не найдет переменную с этим именем, и она назначит ей это. Это может находиться в рамках функции или в глобальной среде.
Для того чтобы понять, что делают эти функции, необходимо также понимать среды R (например, используя search
).
Я регулярно использую эти функции, когда запускаю большую симуляцию, и хочу сохранить промежуточные результаты. Это позволяет вам создать объект за пределами области действия данной функции или цикл apply
. Это очень полезно, особенно если вы беспокоитесь о том, что большой цикл заканчивается неожиданно (например, отключение базы данных), и в этом случае вы можете потерять все в этом процессе. Это было бы эквивалентно написанию результатов в базу данных или файл в течение длительного процесса, за исключением того, что вместо этого они сохраняют результаты в среде R.
Мое основное предупреждение с этим: будьте осторожны, потому что теперь вы работаете с глобальными переменными, особенно при использовании <<-
. Это означает, что вы можете столкнуться с ситуациями, когда функция использует значение объекта из среды, когда вы ожидали, что она будет использовать тот, который был поставлен в качестве параметра. Это одна из основных вещей, которую пытается избежать функциональное программирование (см. side effects). Я избегаю этой проблемы, назначая мои значения уникальным именам переменных (используя пасту с набором или уникальными параметрами), которые никогда не используются в функции, а просто используются для кэширования, и в случае, если мне нужно позже восстановить (или сделать некоторые мета -анализ промежуточных результатов).
Эй, это нерешенная задача R на Rosettacode (http://rosettacode.org/wiki/Accumulator_factory#R) Ну, это было ... –
Было бы нужно заключить более 1 замыкания в одну родительскую функцию? Я просто попробовал один фрагмент, кажется, что только последнее закрытие было выполнено ... –