在R中,我试图创建一个函数,如果值相等或都为NA,则该函数将返回true。
is.equal <- `%==%` <- function(x,y, vect=T) {
res <- ifelse(is.na(x),is.na(y),ifelse(is.na(y),is.na(x),x==y))
if(!vect){
res <- all(res)
}
return(res)
}
c("a","b") %==% "a" #[1] TRUE TRUE
"a" %==% c("a", "b") #[1] TRUE
c("a","b") == "a" #[1] TRUE FALSE
我做错了什么,让这个函数只考虑向量的第一个元素?我希望得到与相同的结果
==
注1:似乎回收并没有像我预期的那样应用
> 1:5 %==% 3
[1] FALSE FALSE FALSE FALSE FALSE
然而
> 1:5 %==% rep(3,5)
[1] FALSE FALSE TRUE FALSE FALSE
注意2:这个版本的函数显式回收,并按预期工作,但我仍然想知道是什么导致了第一个版本中的这种行为:
is.equal <- `%==%` <- function(x,y, vect=T) {
samelength <- length(x) == length(y)
if(!samelength) {
maxlength <- max(length(x), length(y))
minlength <- min(length(x), length(y))
if(minlength==1) {
if(length(x) == maxlength) {
y <- rep(y, maxlength)
} else {
x <- rep(x, maxlength)
}
} else stop('recycling of non-unit vectors disallowed cause bug')
}
res <- ifelse(is.na(x),is.na(y),ifelse(is.na(y),is.na(x),x==y))
if(!vect){
res <- all(res)
}
return(res)
}
> c("a","b") %==% "a"
[1] TRUE FALSE
> "a" %==% c("a", "b")
[1] TRUE FALSE
> c("a","b") == "a"
[1] TRUE FALSE
> 1:5 %==% rep(3,5)
[1] FALSE FALSE TRUE FALSE FALSE
对此很好奇