Single or double?: AND operator and OR operator in R
One classmate complained about having trouble subsetting a data frame to keep non-zero rows, like:
# I don't want rows of zero here!
non_zero <- rna_seq[wt != 0 && mutant != 0 && resq !=0, ]
This did not work as expected. The culprit here was the logical operator &&
. There are two versions of AND and OR in R, &&
, &
, ||
, |
, and just like my friend, I also find it difficult to tell them apart and suffer for very long.
In R, the short version, &
and |
, are logical Boolean operators without short-circuiting. That means that they evaluate every elements they are passed. If you want to do logical comparison, they should work exactly as you expected, in the same fashion of +
or -
.
c(TRUE, FALSE, FALSE) & c(TRUE, TRUE, TRUE)
# If you run it in console
# [1] TRUE FALSE FALSEFALSE & what_ever_variable# This expression is always evaluated false
# But & will still evaluate what_ever_variable before returning# If you run it in console
# Error: object 'what_ever_variable' not found
On the other hand, the long version &&
and ||
will always return only one value, either TRUE
or FALSE
. Regardless of the length of the objects you are passing to it, they only evaluate the first element, and do it with short-circuiting.
c(TRUE, FALSE, FALSE) && c(TRUE, TRUE, TRUE)
# If you run it in console
# [1] TRUEFALSE && what_ever_variable# With short-circuiting, && returns FALSE right after it
# gets passed FALSE and does not care what what_ever_variable is# If you run it in console
# [1] FALSE
The confusion might come from the inconsistency when choosing these operators in different languages. For example, in C, &
performs bitwise AND, while &&
does Boolean logical AND.