Bert Gunter
2016-Oct-05 18:12 UTC
[R] A note on == versus logical operators for logical comparisons
Folks: This post was suggested by a recent post of Fabien Verger. In it, he used a != b as an exclusive-or operator for two logical vectors, a and b. As R already has an exlcusive-or operator, I suggested xor(a,b), which is implemented as (x | y) & !(x & y) i.e. through purely logical operators. However,> b <- sample(c(TRUE,FALSE),1e6,rep=TRUE) > a <- sample(c(TRUE,FALSE),1e6,rep=TRUE)> system.time(as.logical(b) != as.logical(a))user system elapsed 0.002 0.000 0.002> system.time(xor(a,b))user system elapsed 0.022 0.002 0.023 I added the as.logical() cast to handle the case, e.g. a = 1 and b = 2 , for which xor() gives FALSE and a != b gives TRUE without the cast. Such mixups can occur. So given the must greater efficiency of != (or ==) I wondered why that wasn't used for xor(). Here's why:> xor("A","B")Error in x | y : operations are possible only for numeric, logical or complex types> as.logical("A") != as.logical("B")[1] NA That is, xor()'s behavior as a logical operator is consistent with the other logical operators (of course) , while the != implementation is not. There's a moral or two here maybe (beside: "Bert's not the brightest bulb in the chandelier"): 1) There is almost always a good reason why R's core implementation does things the way it does, at least at the user level (I of course cannot comment on the underlying C code). If you think there's a better way, it's probably worthwhile to think again. 2) == is actually a pretty blunt instrument for vector comparisons (which Fabien explicitly noted in his post in the context of numeric comparisons); unless you have pretty strong control over what's being compared, other perhaps less efficient but more robust methods should be considered. Just my view of course. Cheers, Bert Bert Gunter "The trouble with having an open mind is that people keep coming along and sticking things into it." -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )