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,
|, 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
c(TRUE, FALSE, FALSE) & c(TRUE, TRUE, TRUE) # If you run it in console #  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
|| will always return
only one value, either
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 #  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 #  FALSE
The confusion might come from the inconsistency when choosing these
operators in different languages. For example, in C,
bitwise AND, while
&& does Boolean logical AND.