短いものはベクトル化されます。つまり、次のようにベクトルを返すことができます。
((-2:2) >= 0) & ((-2:2) <= 0)
# [1] FALSE FALSE TRUE FALSE FALSE
長い形式は、各ベクトルの最初の要素のみを調べて左から右に評価されるため、上記は次のようになります。
((-2:2) >= 0) && ((-2:2) <= 0)
# [1] FALSE
ヘルプ ページにあるように、これにより長い形式が「制御フローのプログラミングに適したものになり、[is] 通常は if 句で好まれる」ようになります。
したがって、ベクトルの長さが 1 であることが確実な場合にのみ、長い形式を使用する必要があります。
ベクトルが長さ 1 のブール値のみを返す関数である場合など、ベクトルが長さ 1 のみであることを絶対に確認する必要があります。ベクトルの長さが 1 を超える可能性がある場合は、短い形式を使用します。したがって、完全に確信が持てない場合は、最初に確認するか、短い形式を使用してからall
andを使用any
して、 のような制御フロー ステートメントで使用できる長さに短縮する必要がありif
ます。
関数all
および関数any
は、ベクトル化された比較の結果に対して、それぞれすべてまたはいずれかの比較が真であるかどうかを確認するためによく使用されます。これらの関数の結果は必ず長さ 1 になるため、if 節での使用に適していますが、ベクトル化された比較の結果はそうではありません。(ただし、これらの結果は での使用に適していますifelse
。
最後の違いの 1 つ: &&
and||
は、必要な数の項のみを評価します (短絡とは、これを意味するようです)。たとえば、未定義の値を使用した比較を次に示しますa
。短絡していない場合&
は|
、エラーが発生します。
a
# Error: object 'a' not found
TRUE || a
# [1] TRUE
FALSE && a
# [1] FALSE
TRUE | a
# Error: object 'a' not found
FALSE & a
# Error: object 'a' not found
最後に、The R Infernoの「and and and andand」というセクション 8.2.17 を参照してください。