# Issue 'x || y' performs 'x[1] || y' for length(x) > 1. For instance (here using R 3.5.1),
> c(TRUE, TRUE) || FALSE [1] TRUE > c(TRUE, FALSE) || FALSE [1] TRUE > c(TRUE, NA) || FALSE [1] TRUE > c(FALSE, TRUE) || FALSE [1] FALSE This property is symmetric in LHS and RHS (i.e. 'y || x' behaves the same) and it also applies to 'x && y'. Note also how the above truncation of 'x' is completely silent - there's neither an error nor a warning being produced. # Discussion/Suggestion Using 'x || y' and 'x && y' with a non-scalar 'x' or 'y' is likely a mistake. Either the code is written assuming 'x' and 'y' are scalars, or there is a coding error and vectorized versions 'x | y' and 'x & y' were intended. Should 'x || y' always be considered an mistake if 'length(x) != 1' or 'length(y) != 1'? If so, should it be a warning or an error? For instance, '''r > x <- c(TRUE, TRUE) > y <- FALSE > x || y Error in x || y : applying scalar operator || to non-scalar elements Execution halted What about the case where 'length(x) == 0' or 'length(y) == 0'? Today 'x || y' returns 'NA' in such cases, e.g. > logical(0) || c(FALSE, NA) [1] NA > logical(0) || logical(0) [1] NA > logical(0) && logical(0) [1] NA I don't know the background for this behavior, but I'm sure there is an argument behind that one. Maybe it's simply that '||' and '&&' should always return a scalar logical and neither TRUE nor FALSE can be returned. /Henrik PS. This is in the same vein as https://mailman.stat.ethz.ch/pipermail/r-devel/2017-March/073817.html - in R (>=3.4.0) we now get that if (1:2 == 1) ... is an error if _R_CHECK_LENGTH_1_CONDITION_=true ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel