Возврат вызова из дочернего кадра
Как я могу вернуть значение в функцию через другую функцию, см. Пример здесь:
first_try <- function() eval(return(1),parent.frame())
second_try <- function() source(textConnection("return(2)"),parent.frame())
fun1 <- function(x){
first_try()
second_try()
3
}
fun1()
# [1] 3
fun1
следует остановиться на first_try
и вернуться 1
, и если second_try
работал бы он вернулся 2
,
Это возможно?
0 ответов
rlang::return_from()
предоставляет эту функциональность:
return_a <- function() rlang::return_from(parent.frame(),"a")
fun <- function(){
return_a()
"b"
}
fun()
#> [1] "a"
Создано 2020-01-03 пакетом REPEX (v0.3.0)
Мы также можем исправить мою первую попытку, указав return(1)
и использовать rlang::eval_bare()
скорее, чем base::eval()
Из документа:
eval_bare() - это версия нижнего уровня функции base::eval(). Технически это простая оболочка для функции C Rf_eval(). Обычно вам не нужно использовать eval_bare() вместо eval (). Его главное преимущество заключается в том, что он обрабатывает чувствительные к стеку (такие вызовы, как return (), on.exit() или parent.frame ()) более последовательно, когда вы передаете среду кадра в стеке вызовов.
first_try <- function() rlang::eval_bare(quote(return(1)),parent.frame())
fun1 <- function(x){
first_try()
second_try()
3
}
fun1()
#> [1] 1
Создано 2020-01-03 пакетом REPEX (v0.3.0)