web-dev-qa-db-ja.com

ブール演算子&&および||

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

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

誰かがここに光を当てることができますか?また、RにAndAlsoとOrElseがありますか?

217
SFun28

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

((-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を使用して、制御フローステートメントで使用できるようにifのように短くします。

関数allanyは、ベクトル化された比較の結果に対してよく使われ、それぞれの比較がすべて真または真であるかどうかを調べます。これらの関数の結果は必ず長さ1になるので、if節での使用に適していますが、ベクトル化された比較の結果はそうではありません。 (ただし、これらの結果はifelseでの使用に適しています。

最後の違いの1つは、&&||は必要なだけの数の用語を評価することです(これは短絡によって意味されるようです)。たとえば、これは未定義の値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

最後に、 "and and andand"というタイトルの R Inferno のセクション8.2.17を参照してください。

305
Aaron

"ショートサーキット" に関する答えは誤解を招く可能性がありますが、いくつかの真実があります(下記参照)。 R/S言語では、&&||は最初の引数の最初の要素のみを評価します。ベクトルまたはリスト内の他のすべての要素は、最初の1の値に関係なく無視されます。これらの演算子は、新しいベクトルを構築するのではなく、if (cond) {} else{}構造を処理し、プログラム制御を指示するように設計されています。&および|演算子は、ベクトルに対して処理するように設計されています。最長の引数の長さベクトルが同じ長さではない場合、短い引数のリサイクルが実行されます。

&&または||への引数が評価されるとき、左から右へ連続している値のいずれかが決定的であるならば、評価は中止されそして最終的な値が返されるという意味で「短絡」があります。

> if( print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 2
> if(FALSE && print(1) ) {print(2)} else {print(3)} # `print(1)` not evaluated
[1] 3
> if(TRUE && print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 2
> if(TRUE && !print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 3
> if(FALSE && !print(1) ) {print(2)} else {print(3)}
[1] 3
29
42-

&&||は、いわゆる「短絡」です。つまり、最初のオペランドが式の値を決定するのに十分であれば、2番目のオペランドは評価されません。

例えば、&&の最初のオペランドがfalseの場合、式の値を変更することはできないので、2番目のオペランドを評価する意味はありません(false && truefalse && falseは両方ともfalseです)。最初のオペランドがtrueの場合も、||に同じことが言えます。

あなたはここでこれについてもっと読むことができます: http://ja.wikipedia.org/wiki/Short-circuit_evaluation あなたが見ることができるそのページの表からその&&はVB.NETのAndAlsoに相当します。

21
Theo