292

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

ヘルプテキストによると、「And」と「AndAlso」(対応する「Or」と「OrElse」)の違いに似た違いを読みました... (つまり、A が true の場合、A or B or C は常に true であるため、A が true の場合は評価を停止します)

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

4

3 に答える 3

395

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

((-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 を超える可能性がある場合は、短い形式を使用します。したがって、完全に確信が持てない場合は、最初に確認するか、短い形式を使用してからallandを使用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 を参照してください。

于 2011-07-02T19:13:54.540 に答える
45

「短絡」についての答えは誤解を招く可能性がありますが、いくつかの真実があります (以下を参照)。R/S 言語で&&||、最初の引数の最初の要素のみを評価します。ベクトルまたはリスト内の他のすべての要素は、最初の要素の値に関係なく無視されます。これらの演算子は、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

短絡の利点は、引数の評価に時間がかかる場合にのみ現れます。これは通常、引数がより大きなオブジェクトを処理する関数であるか、より複雑な数学演算を行う関数である場合に発生します。

于 2011-07-02T19:15:44.243 に答える
31

&&||いわゆる「短絡」です。これは、最初のオペランドが式の値を決定するのに十分である場合、2 番目のオペランドを評価しないことを意味します。

たとえば、最初のオペランド to&&が false の場合、2 番目のオペランドを評価しても意味がありません。これは、式 (false && truefalse && falseが両方とも false) の値を変更できないためです。第||1 オペランドが true の場合も同様です。

詳細については、こちらを参照してください: http://en.wikipedia.org/wiki/Short-circuit_evaluationそのページの表から、参照しているVB.NET&&と同等であることがわかります。AndAlso

于 2011-07-02T19:00:38.050 に答える