R语言自定义相等判断函数向量循环匹配异常问题排查
问题根源:嵌套
ifelse的长度匹配陷阱 你的原函数异常的核心原因是嵌套ifelse的返回长度由各自的test参数决定,而非自动对齐输入向量的最长长度,导致向量循环匹配逻辑失效。
具体分析每个测试用例:
c("a","b") %==% "a"返回TRUE TRUE(预期TRUE FALSE)- 内部
ifelse(is.na(y), is.na(x), x==y)的test是is.na(y),长度为1(因为y="a"是单个值)。 - 根据
ifelse规则,该内部调用仅返回长度为1的结果:取x==y的第一个元素TRUE。 - 外部
ifelse的test是is.na(x),长度为2,因此会把内部返回的TRUE循环填充为长度2的向量c(TRUE, TRUE),最终得到错误结果。
- 内部
"a" %==% c("a", "b")返回TRUE(预期TRUE FALSE)- 外部
ifelse的test是is.na(x),长度为1(x="a"是单个值)。 - 内部
ifelse返回长度为2的向量c(TRUE, FALSE),但外部ifelse仅取该向量的第一个元素TRUE作为结果,导致返回长度为1的向量。
- 外部
1:5 %==% 3返回全FALSE(预期含一个TRUE)- 内部
ifelse的test是is.na(y),长度为1,因此仅返回x==y的第一个元素FALSE(1==3为假)。 - 外部
ifelse将这个FALSE循环填充为长度5的向量,最终得到全FALSE。
- 内部
正确的实现方式(替代嵌套ifelse)
直接用逻辑向量组合实现元素-wise判断,利用R原生的向量循环规则:
is.equal <- `%==%` <- function(x, y, vect = TRUE) { res <- (is.na(x) & is.na(y)) | (!is.na(x) & !is.na(y) & x == y) if (!vect) res <- all(res) res }
这个版本会自动对齐x和y的长度(按R的向量循环规则),返回与最长输入向量长度一致的结果,符合预期。
内容的提问来源于stack exchange,提问作者gaut
相关产品推荐
相关产品推荐

