如果函数中不存在,函数不应 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)
}
我正在编写一个包含一些条件的函数。函数的 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)
}