3

How can I return a value in a function, through another function, see example here :

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 should stop at first_try and return 1, and if second_try had worked it would have returned 2.

Is such a thing possible ?

4

1 回答 1

0

rlang::return_from()提供此功能:

return_a <- function() rlang::return_from(parent.frame(),"a")

fun <- function(){
  return_a()
  "b"
}
fun()
#> [1] "a"

reprex 包(v0.3.0)于 2020-01-03 创建

我们也可以通过引用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

reprex 包(v0.3.0)于 2020-01-03 创建

于 2020-01-03T15:08:56.047 回答