R - оценка return () в родительской среде - PullRequest
0 голосов
/ 13 января 2019

Мне нужна функция "inside" для возврата, как если бы это была родительская функция.

Пример:

some_fn <- function() {
  inside_fn <- function() {
    eval.parent(return("I wish"))
  }
  inside_fn()
  return("I wish not")
}

some_fn()
## [1] "I wish not"

Использование stop() с on.exit() работает ...

some_fn_2 <- function() {
  on.exit(return("Well, this works"))
  inside_fn <- function() {
    eval.parent(return("I wish"))
    stop()
  }
  inside_fn()
  return("I wish not")
}

some_fn_2()
[1] "Well, this works"

... но вроде как хакерский, и мне интересно, есть ли более чистый способ сделать это. Я знаю, что это не совсем просто; это будет означать игнорирование части стека вызовов, но все же, я хотел бы узнать ваши мысли, уважаемое сообщество. :)

1 Ответ

0 голосов
/ 14 января 2019

callCC может прерывать вложенные вызовы:

callCC(function(k) {
  inside_fn <- function() {
    k("I wish")
  }
  inside_fn()
  return("I wish not")
})
## [1] "I wish"
...