Это помогает думать об этом <<-
как об эквиваленте assign
(если вы установите для inherits
параметра в этой функции значение TRUE
). Преимущество assign
заключается в том, что он позволяет вам указывать больше параметров (например, среду), поэтому в большинстве случаев я предпочитаю использовать assign
over <<-
.
Использование <<-
и assign(x, value, inherits=TRUE)
означает, что «окружающие среды предоставленной среды ищутся до тех пор, пока не встретится переменная 'x'». Другими словами, он будет продолжать просматривать среды по порядку, пока не найдет переменную с таким именем и не присвоит ее ей. Это может быть в рамках функции или в глобальной среде.
Чтобы понять, что делают эти функции, вам нужно также понимать среды R (например, использование search
).
Я регулярно использую эти функции, когда запускаю большое моделирование и хочу сохранить промежуточные результаты. Это позволяет вам создавать объект вне области действия данной функции или apply
цикла. Это очень полезно, особенно если вас беспокоит неожиданное завершение большого цикла (например, отключение базы данных), и в этом случае вы можете потерять все в процессе. Это было бы эквивалентно записи ваших результатов в базу данных или файл во время длительного процесса, за исключением того, что вместо этого результаты сохраняются в среде R.
Мое главное предупреждение: будьте осторожны, потому что теперь вы работаете с глобальными переменными, особенно при использовании <<-
. Это означает, что вы можете столкнуться с ситуациями, когда функция использует значение объекта из среды, когда вы ожидали, что она будет использовать значение, указанное в качестве параметра. Это одна из основных вещей, которых пытается избежать функциональное программирование (см. Побочные эффекты ). Я избегаю этой проблемы, присваивая свои значения уникальным именам переменных (с использованием вставки с заданными или уникальными параметрами), которые никогда не используются внутри функции, а используются только для кеширования и в случае, если мне нужно будет восстановить позже (или выполнить некоторые мета -анализ промежуточных результатов).
<<-
для сохранения ключевых переменных, сгенерированных внутри функции, для записи в журналы отказов при сбое функции. Может помочь сделать сбой воспроизводимым, если функция использует входные данные (например, из внешних API), которые не обязательно были бы сохранены в противном случае из-за сбоя.