r - 如果函数中不存在值,则函数不应返回
问题描述
我正在编写一个包含一些条件的函数。函数的返回值将取决于这样的条件,根据条件,返回值甚至可能不存在于函数中。在这种情况下,我希望该函数会引发错误。但是,这仅适用于假定返回值不存在于全局环境中的情况。如果是这样,则返回来自全局环境的值,这让我感到困惑。
我在这里想念什么?我究竟做错了什么?
例子:
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 的值,如果它存在于函数内部。我怎样才能做到这一点?
谢谢
解决方案
如果访问函数中的自由变量(引用但未定义),则它会在定义该函数的环境中查找,然后在该函数的父环境中查找,依此类推。
用于仅在当前环境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
推荐阅读
- vue.js - vue js,IE9点击路由器链接刷新?
- python - 带补丁的 FCN 创建边界
- wso2 - WSO2 EI 培训材料
- html - 在 Microsoft Edge 上定位可悬停卡片标题
- javascript - X 和 Y 之间的当前时间是 Moment 的时间吗?
- php - 修改输入字段名称的 Laravel 注册测试
- azure - Azure 批量遥测数据注入 dstabade
- python - SQLAlchemy - 从双向关联代理访问属性
- python - 通过分隔符 pandas python 拆分列并仅保留新名称
- python - 在 Python 中创建随机数据矩阵