Полагаю, один простой способ изменить существующую функцию - использовать инструмент отладки trace()
. Мы можем использовать это для вставки кода, который будет запускаться при выходе из функции, чтобы «утечь» все значения из области действия функции в глобальную область. Вот такая функция
make_leaky <- function(f) {
fn <- substitute(f)
invisible(trace(fn, print=FALSE, exit=quote(list2env(mget(ls()), globalenv()))))
}
Затем мы можем проверить ее с помощью следующей функции
foo <- function(x, y) {
a <- x+7
b <- x*y
b/a
}
Мы будем использовать ls()
, чтобы увидеть все переменные на каждом шаге
ls()
# [1] "foo" "make_leaky"
foo(5,2)
# [1] 0.8333333
ls() # NO NEW VARIABLES CREATED HERE
# [1] "foo" "make_leaky"
make_leaky(foo)
foo(5,2)
# [1] 0.8333333
ls() # ALL VARIABLES FROM FOO ARE NOW IN GLOBAL ENV
# [1] "a" "b" "foo" "make_leaky"
# [5] "x" "y"