如果函数中不存在,函数不应 return 一个值

Function should not return a value if it doesn't exist in the function

我正在编写一个包含一些条件的函数。函数的 returning 值将取决于这样一种条件,即根据条件 returning 值甚至可能不存在于函数中。在那种情况下,我希望该函数会抛出错误。但是,这仅在假定的 return 值不存在于全局环境中时才有效。如果是这样,来自全局环境的值是 returned,这让我感到困惑。

我在这里错过了什么?我做错了什么?

示例:

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

  return(z)
}

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

Error in xyz(2, 3) : object 'z' not found

但是,现在我正在全局环境中创建一个 z 值。

z <- 3.14

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

我原以为该函数只会 return z 的值(如果它存在于函数内部)。我该怎么做?

谢谢

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

使用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

为什么不根据条件而不是 z 抛出 信息性 错误?

xyz <- function(x = NULL, y = NULL)
{
    if ( x + y <= 10 ) {
        stop("The sum of x and y must be greater than 10.")
    }
    return(x + y)
}

xyz(20, 30)
# [1] 50
xyz(2, 3)
# Error in xyz(2, 3) : The sum of x and y must be greater than 10.

我喜欢 duckmayr 的想法,但这里是您可以在仍然使用 z 的同时实施的方法:

xyz <- function(x = NULL, y = NULL) {
    z = x + y
    if (z <= 10 ) {
        stop("The sum of x and y must be greater than 10.")
    }
    return(z)
}