Возможно, вы можете изменить всю настройку, чтобы избежать этого, но если нет, то можно использовать callCC
.
1) Важно то, что return_2_from_top_level
должен знать о g
, поэтому мы сбрасываем указанные функциональные среды в значение в top
, где известно g
.
return_2_from_top_level <- function() g(2)
top_level <- function() {
return_2_from_top_level()
Sys.sleep(2)
1
}
top <- function(g) {
environment(return_2_from_top_level) <- environment()
environment(top_level) <- environment()
top_level()
}
callCC(top)
## [1] 2
2) В качестве альтернативы мы можем переместить определения top_level
и return_2__from_top_level
в top
, и в этом случае явного вмешательства в окружение не будет.
top <- function(g) {
return_2_from_top_level <- function() g(2)
top_level <- function() {
return_2_from_top_level()
Sys.sleep(2)
1
}
top_level()
}
callCC(top)
## [1] 2
3) Другая возможность - скопировать g
в глобальную среду.
return_2_from_top_level <- function() g(2)
top_level <- function() {
return_2_from_top_level()
Sys.sleep(2)
1
}
top <- function(g) {
g <<- g
top_level()
}
callCC(top)
## [1] 2