1. ホーム
  2. r

[解決済み】ブール演算子 && と || について

2022-04-14 19:43:51

質問

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

によると ヘルプテキスト この違いは、「"And" と "AndAlso" (対応する "Or" と "OrElse" )の違いに似ていると思うのですが...」。 意味は 必要がなければすべての評価を行わないこと(例:Aが真であればAまたはBまたはCは常に真なので、Aが真であれば評価を停止する)

どなたか、ここに光を当てていただけませんか? また、RにAndAlsoとOrElseはあるのでしょうか?

どのように解決するのですか?

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

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

長い方の形式は、各ベクトルの最初の要素だけを調べて左から右に評価するので、上記のようになります。

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

ヘルプにあるように、この長い形式はプログラミングの制御フローに適しており、if節では一般的に好まれます。

ですから、長い形式を使うのは、ベクトルの長さが1であることが確実な場合だけにしてください。

にする必要があります。 絶対に 例えば、長さ1のブール値を返す関数のように、ベクトルが長さ1であることが確実な場合です。 ベクトルが長さ1である可能性がある場合は、短縮形を使いたい。 allany のように、制御フロー文の中で使用するために、長さを1つに減らすことができます。 if .

機能 allany は、ベクトル化された比較の結果に対して使われることが多く、それぞれ比較のすべてが真か、あるいはいずれかが真かを確認するために使われます。これらの関数の結果は確実に長さ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インフェルノ というタイトルがつけられています。