Então estou desenvolvendo essa função
#' Disambiguated Equality operator between two vectors that may contain NA's
#'
#' Forces the equality result to be TRUE if both corresponding vector elements are either equal, or both NA.
#' @param x vector of any type compatible with is.na and ==.
#' @param y vector of any type compatible with is.na and ==.
#' @export
#' @examples
#' c(NA, 1:5) %==% c(NA, 1:3,"nope", NA) #[1] TRUE TRUE TRUE TRUE FALSE FALSE
gp.is.equal.force <- `%==%` <- function(x, y, vect = T) {
res <- (is.na(x) & is.na(y)) | (!is.na(x) & !is.na(y) & x == y)
if (!vect) res <- all(res)
res
}
Percebi um comportamento que não esperava em relação aos valores NaN na versão R 4.3.2 (31/10/2023) - "Eye Holes".
> is.na(NaN) # [1] TRUE
> is.na(c(NaN, 5)) # [1] TRUE FALSE
> is.na(c(NaN, NA)) # [1] TRUE TRUE
> is.nan(c(NaN, NA)) # [1] TRUE FALSE
> is.na(c(NaN, as.factor("abc"))) # [1] TRUE FALSE
> is.nan(c(NaN, 5)) # [1] TRUE FALSE
até agora está tudo bem, no entanto:
> is.na(c(NA, NaN, "abc")) # [1] TRUE FALSE FALSE
> is.nan(c(NA, NaN, "abc")) # [1] FALSE FALSE FALSE
> is.nan(c(NaN, "abc")) #[1] FALSE FALSE
Parece que adicionar character
s à mistura quebra de alguma forma a lógica dos NaN
valores. Não é peculiar?
De
?NaN
(meu negrito),Adicionar caracteres a um vetor forçará esse vetor ao tipo de caractere, portanto,
NaN
não representa mais "não um número", mas o caractere "NaN".Como esperado,
is.nan
retornaráFALSE
para personagens.