从子框架调用返回

时间:2018-02-22 13:18:49

标签: r return eval r-environment

如何通过另一个函数返回函数中的值,请参见此处的示例:

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

这样的事情可能吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

reprex package(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 package(v0.3.0)于2020-01-03创建