本文
短絡評価するかどうかです。
&だと左と右がどちらも評価されますが、&&だと左がFALSEなら右は評価されずにFALSEを返します。
基本的に、&&の場合は単一要素ベクトルしか想定されていないと考えると良さそうです。
&はベクトル演算で&&は制御構造と考えても良いかもしれません。
c(TRUE, FALSE, TRUE) & c(TRUE, FALSE, FALSE)
# [1] TRUE FALSE FALSE
# [非推奨] &&だと最初の要素のみで評価される挙動になるが、複数要素のベクトルには使わない方が自然。
c(TRUE, FALSE, TRUE) && c(TRUE, FALSE, FALSE)
# [1] TRUE
x <- c("A", "B", "C")
is.numeric(x) && sd(x) > 0
# [1] FALSE
## sd(x) > 0は単独だとNAを返すが、左がFALSEなので短絡されて評価されていない
is.numeric(x) & sd(x) > 0
# [1] FALSE
# Warning message:
# In var(if (is.vector(x) || is.factor(x)) x else as.double(x), na.rm = na.rm) :
# NAs introduced by coercion
## &でもFALSEが返るが右も評価されてWarninngが出ている。
## 数値型ならsdを計算するという制御を考えるなら&&を使った方が良い
おまけ
短絡評価を使った遊びです。
どういう処理になっているか考えてみてください。
# R version > 4.2
hoge <- \(x) x |> is.null() && return() || return(round(x))
hoge(3.2)
# [1] 3
hoge(NULL)
# NULL
## \(x)はfunction(x)のこと
## |>はパイプライン演算子
## &&は、左がFALSEの場合は右は評価されないが、左がTRUEの場合は左も評価する。
## ||は、左がFALSEの場合は右は評価されるが、左がTRUEの場合は右は評価しない。