Возврат вызова из дочернего кадра

Как я могу вернуть значение в функцию через другую функцию, см. Пример здесь:

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)

Другие вопросы по тегам