This is a follow-up question below.
How to extend `==` behavior to vectors that include NAs?
In the link, suppose we would like to compare
a = c(1,2,NA)
b = c(1,3,NA)
Using the function of "%==%" <- function(a, b) (!is.na(a) & !is.na(b) & a==b) | (is.na(a) & is.na(b)), and we have the following result
a %==% b
# TRUE FALSE TRUE
My question is how to use %==% in the data.table::data.table function. Why the following code does not work properly? The first two results are good, but it seems that %==% cannot be used with operations, i.e. the a+a2 below.
dt_a = data.table(a = a, a2 = a+a)
dt_a[,a %==% b]
# TRUE FALSE TRUE
dt_a[,a2 %==% b]
# FALSE FALSE TRUE
dt_a[,a+a2 %==% b]
# 1 2 NA # this line of result is confusing.
>Solution :
It’s a problem of operator precedence. You would need
dt_a[,(a+a2) %==% b]
The fake equals has a different precedence than a normal == what you write originally was equivalent to
dt_a[,a+(a2 %==% b)]
Addition operators are higher precedence than test for equality but lower precedence than custom infix %% functions. See the ?Syntax help page for the full details.
Note this doesn’t have anything to do with data.table specifically. Same things happens outside
a <- c(1,2,NA)
b <- c(1,3,NA)
a2 <- a+ a
a+a2 %==% b
# [1] 1 2 NA