R におけるブール演算子 && と & の違いと || と | の違い 質問する

R におけるブール演算子 && と & の違いと || と | の違い 質問する

によるR言語の定義&&&(対応する|と)の違いは、||前者はベクトル化されているのに対し、後者はベクトル化されていないことです。

によるとヘルプテキスト、私はこの違いを「And」と「AndAlso」(対応する「Or」と「OrElse」)の違いに似ていると読みました...意味:必ずしもそうである必要はない(つまり、Aが真であればAまたはBまたはCは常に真なので、Aが真であれば評価を停止する)

誰かこの点について説明してもらえませんか? また、R には AndAlso と OrElse はありますか?

ベストアンサー1

短いものはベクトル化されており、次のようにベクトルを返すことができます。

((-2:2) >= 0) & ((-2:2) <= 0)
# [1] FALSE FALSE  TRUE FALSE FALSE

長い形式はそうではないので、(4.3.0 以降) 長さ 1 の入力を指定する必要があります。(やった! 必要なチェックが少なくなりました。以下を参照してください。)

R 4.3.0 までは、長さが 1 を超える && 入力を与えてもエラーは発生しませんでしたが、代わりに各ベクトルの最初の要素のみを調べて左から右に評価されました。そのため、上記の例では次のようになります。

((-2:2) >= 0) && ((-2:2) <= 0)
# [1] FALSE

ヘルプ ページに記載されているように、これにより、長い形式は「プログラミング制御フローに適しており、通常は if 節で好まれます」。

したがって、ベクトルの長さが 1 であることが確実な場合にのみ長い形式を使用する必要があり、4.3.0 以降では、R はこれを強制します。

以前のバージョンを使用している場合、ベクトルの長さが 1 のみであることを絶対に確認する必要があります (長さ 1 のブール値のみを返す関数の場合など)。ベクトルの長さが 1 より大きい可能性がある場合は、短縮形を使用する必要があります。したがって、確信が持てない場合は、最初に確認するか、短縮形を使用してから と を使用してallanyさを 1 に短縮し、 などの制御フロー ステートメントで使用する必要がありますif

関数およびallは、anyそれぞれ、すべての比較またはいずれかの比較が真であるかどうかを確認するために、ベクトル化された比較の結果に対してよく使用されます。これらの関数の結果は長さが 1 であることが確実なので、if 節で使用するのに適していますが、ベクトル化された比較の結果は適していません。(ただし、これらの結果は で使用するのに適していますifelse。)

最後の違いは、&&と は||必要な数だけ項を評価することです (これはしばしば短絡と呼ばれます)。たとえば、未定義の値 を使用した比較を次に示します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

最後に、セクション8.2.17を参照してください。Rインフェルノ、タイトルは「and and andand」。

おすすめ記事