按返回父功能

时间:2017-03-17 13:27:29

标签: r return environment

有没有办法强制父函数返回输出?假设我有一个功能“做某事”'并且在每个功能的开头,想要检查一些东西'。如果检查失败,我想返回其他内容'。

在我的下面的例子中'做了一些事情'是对数,检查一些东西'意味着检查变量是否为非负数和“其他内容”。是负无穷大。

weird_log <- function(x) {
  check(x)
  log(x)
}

check <- function(x) {
  if (x <= 0)
    eval.parent(parse(text = 'return(-Inf)'))
}

这个例子不起作用

weird_log(10)  # 2.302585
weird_log(-10) # NaN

一种解决方案是返回其他内容&#39;如果检查发现问题则来自检查功能,否则NULL。然后我可以在父函数中写一个if并完成它。

weird_log <- function(x) {
  y <- check(x)
  if (!is.null(y)) return(y)
  log(x)
}

check <- function(x) {
  if (x <= 0) {
    -Inf
  } else {
    NULL
  }
}

此解决方案仍然将大多数功能保留在分离的函数check()中,但有没有办法在其中包含所有功能?

在实际问题中,检查功能不仅仅进行一次比较,而且它用于多个功能,因此必须单独使用它。还有其他的东西&#39;返回check函数取决于输入失败的条件。

更现实的例子:

weird_log <- function(input) {
  y <- check(input)
  if (!is.null(y)) return(y)
  list(log = log(input$x))
}

check <- function(input) {
  if (is.null(input$x)) {
    list(error = 'x is missing')
  } else if (!is.numeric(input$x)) {
    list(error = 'x is not numeric')
  } else if (x <= 0) {
    list(log = -Inf, warn = 'x is not positive')
  } else {
    NULL
  }
}

2 个答案:

答案 0 :(得分:5)

http://www.newtonsoft.com/json/help/html/SerializeTypeNameHandling.htm

weird_log <- function(x) {
  if (check(x)) return(-Inf)
  log(x)
}

check <- function(x) {
  x <= 0
}

weird_log(10)  # 2.302585
weird_log(-10) # -Inf

更常见的是在检查失败时要抛出错误的用例:

weird_log <- function(x) {
  check(x)
  log(x)
}

check <- function(x) {
  if(x <= 0) stop("x <= 0", call. = FALSE)
}

weird_log(10)  # 2.302585
weird_log(-10) # Error: x <= 0

答案 1 :(得分:1)

因为答案实际上并不能回答问题,所以这里是如何完成所要求的事情。

returnFromParent <- function() {
  call <- rlang::expr(return()) 
  rlang::eval_bare(call, env = parent.frame())
}

foo <- function(){
  returnFromParent()
  print("you should not see this")
}

foo()

我发现做到这一点的唯一方法是使用rlang。