首页 > 解决方案 > 如果函数中不存在值,则函数不应返回

问题描述

我正在编写一个包含一些条件的函数。函数的返回值将取决于这样的条件,根据条件,返回值甚至可能不存在于函数中。在这种情况下,我希望该函数会引发错误。但是,这仅适用于假定返回值不存在于全局环境中的情况。如果是这样,则返回来自全局环境的值,这让我感到困惑。

我在这里想念什么?我究竟做错了什么?

例子:

xyz <- function(x = NULL, y = NULL)
{
  if (x+y > 10) {z <- x + y}

  return(z)
}

如果我现在运行,test <- xyz(20, 30)我会得到正确的结果(测试 = 50)。如果我运行,test <- xyz(2, 3)我也会正确地得到一个错误:

xyz(2, 3) 中的错误:找不到对象“z”

但是,现在我正在全球环境中创造 az 价值。

z <- 3.14

当我现在运行我的函数时test <- xyz(2, 3),我得到 3.14 作为结果。

我期望该函数只会返回 z 的值,如果它存在于函数内部。我怎样才能做到这一点?

谢谢

标签: rfunctionenvironment

解决方案


如果访问函数中的自由变量(引用但未定义),则它会在定义该函数的环境中查找,然后在该函数的父环境中查找,依此类推。

用于仅在当前环境get("z", inherits = FALSE)中查找z或仅在当前环境中检查是否存在exists("z", inherits = FALSE)

另一种可能性是总是给出z一个值:

z <- if (length(x) && length(y) && x + y > 10) x + y

在这种情况下z,如果条件为假,则值为 NULL,因为默认else支路为 NULL。不可见地返回 NULL 将尽可能接近不返回值。

xyz2 <- function(x = NULL, y = NULL) {
  z <- if (length(x) && length(y) && x + y > 10) x + y
  # other processing can go here
  if (is.null(z)) invisible(z) else z
}
xyz2(1, 2)
xyz2(5, 9)
## [1] 14

推荐阅读