local
делает то, что вы хотите (а IIFE - это хак в JavaScript, чтобы обойти отсутствие local
-подобной функциональности).
Ваш код %gets%
завершается ошибкой, потому что вы неправильно понимаете, как оцениваются аргументы: в вашей функции val
является аргументом. Это означает, что оценивается в объеме вызывающего абонента , без исключений. Заключение в local
просто означает, что результат оценки val
заключен в локальный код, то есть в этом случае не имеет смысла. не означает, что выражение вычисляется локально; если бы это было так, вам бы не понадобился local
, вы могли бы просто оценить его в области действия функции.
Вы можете сделать это, если хотите, используя eval
:
`%gets%` = function (x, expr) {
assign(
as.character(substitute(x)),
eval(substitute(expr)),
parent.frame()
)
}
... но это не будет очень полезно, так как он не может получить доступ к переменным области видимости вызывающего абонента; скорее, вам придется оценивать его в области, которая внедряет область действия вызывающего, чтобы у вас была «чистая» среда, но при этом вы могли получить доступ к существующим переменным:
`%gets%` = function (x, expr) {
parent = parent.frame()
assign(
as.character(substitute(x)),
eval.parent(substitute(eval(quote(expr), new.env(parent = parent)))),
parent
)
}
… но это, по сути, просто запутанный способ переопределения local
назначения.