Все здесь избыточно, так как R имеет встроенную функцию оценки локальной области видимости, называемую local().

x <- local({
temp <- 5
temp + 5
})
local({
temp <- 5
x <<- temp + 5
})

Любого из приведенных выше способов достаточно, чтобы присвоить значение x, не оставляя временной переменной, загрязняющей окружающую среду.

Выражение немедленно вызываемой функции (IIFE) — это популярный шаблон программирования в Javascript. Цель состоит в том, чтобы использовать временные переменные для создания чистого кода, но не позволять переменным сохраняться после их использования для загрязнения вашей среды. Для R есть дополнительные преимущества, заключающиеся в том, что окно среды в RStudio не засоряется, а использование памяти сокращается, поскольку бесполезные данные можно немедленно очистить с меньшим количеством кода, чем при использовании rm.

Базовая форма в Javascript выглядит так:

(function () { /* ..code here.. */ })()

В этом выражении вы сначала объявляете анонимную функцию, а затем вызываете эту функцию. Любые переменные, объявленные в функции, будут очищены при выходе из функции, и останутся только побочные эффекты. Чтобы понять этот шаблон, мы можем рассмотреть почти эквивалентный код:

f <- function () { /* ..code here.. */ }
f()

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

data(iris)
keep <- iris$Sepal.Length > 5 & iris$Sepal.Width < 3
iris[keep, ]

Здесь вы на самом деле не хотите сохранять переменную keep после того, как она была использована. Мало того, что это загромождает ваше рабочее пространство, если вы используете то же самое общее имя переменной позже в своем скрипте, то существует высокий риск возникновения ошибок. Вы можете просто поместить его прямо в скобки, но есть много ситуаций, когда назначение этих временных переменных значительно улучшает читабельность вашего кода. Очень просто обернуть код шаблоном IIFE:

(function(){
data(iris)
keep <- iris$Sepal.Length > 5 & iris$Sepal.Width < 3
iris[keep, ]
})()

Эти две строки можно добавить выше и ниже любого фрагмента кода по вашему выбору, чтобы избавиться от любых локально объявленных переменных. Кроме того, в R есть специальный оператор ‹‹- для помещения переменных в глобальную область, так что вы можете «экспортировать» переменные, которые вы хотите сохранить, из этих временных сред области действия:

(function(){
data(iris)
keep <<- iris$Sepal.Length > 5 & iris$Sepal.Width < 3
iris[keep, ]
})()

Теперь ваша переменная keep снова доступна.

IIFE делает временные переменные действительно временными. Он группирует логически связанный код в блоки и помогает поддерживать компактность и чистоту вашей среды. Существующий код легко обернуть, а оператор глобального объявления R позволяет выталкивать значения, которые вы хотите сохранить, из вашей локальной среды.