Single or double?: AND operator and OR operator in R

Yen-Chung Chen
biosyntax
Published in
2 min readSep 21, 2018
Photo by Jørgen Håland on Unsplash

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 FALSE
FALSE & 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] TRUE
FALSE && 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.

--

--