&&と||の部分を知っています チェーン内で実行するテストの数が最も少なく、チェーンの結果がどうなるかを知るのに十分な情報が得られるとすぐに発生するため、より効率的なコードを作成します。
しかし、私はギャレットGrolemundの中で読んで著書「...二重の事業者がどこでも適切でない&&と||は、それらが意味し、ベクトル化されていないことだけオペレータのそれぞれの側に単一の論理テストを扱うことができる...」缶誰かください。強調部分の意味を説明してください。
いくつかの簡単なテストを行い、&が2つの論理ベクトルの対応する要素間で要素ごとの比較を行っている間、&&は最初の要素のみを比較し、演算子がvecorizedされていないためTRUEを返しますか?上記の強調された部分はすべて意味ですか、それともそれ以上のものがありますか?
c(T, F, F, F, F) & c(T, T, F, T, F)
[1] TRUE FALSE FALSE FALSE FALSE
c(T, F, F, F, F) && c(T, T, F, T, F)
[1] TRUE
c(F, F, F, F, F) && c(T, T, F, T, F)
[1] FALSE
any
とを使用して、演算子のいずれかの側のベクトルを1つのブール値に折りたたみall
ます。
any(T, T, F, F, T) && all(F, F, T, T, T)
[1] FALSE
any(T, T, F, F, T) && any(F, F, T, T, T)
[1] TRUE
オペレーターの両側で1つの論理テストのみを処理できます
a <- c(T, F, F, F)
b <- c(T, F, F, F)
a && b
[1] TRUEを返します
最初の要素だけためa
とはb
テストされています!
「回転」a
しb
、各&&
テストの後に、次のことを考慮してください。
a <- c(T, F, T, F)
b <- c(T, F, F, T)
for (i in seq_along(a)){
cat(paste0("'a' is: ", paste0(a, collapse=", "), " and\n'b' is: ", paste0(b, collapse=", "),"\n"))
print(paste0("'a && b' is: ", a && b))
a <- c(a[2:length(a)], a[1])
b <- c(b[2:length(b)], b[i])
}
私たちに与える:
'a' is: TRUE, FALSE, TRUE, FALSE and
'b' is: TRUE, FALSE, FALSE, TRUE
[1] "'a && b' is: TRUE"
'a' is: FALSE, TRUE, FALSE, TRUE and
'b' is: FALSE, FALSE, TRUE, TRUE
[1] "'a && b' is: FALSE"
'a' is: TRUE, FALSE, TRUE, FALSE and
'b' is: FALSE, TRUE, TRUE, FALSE
[1] "'a && b' is: FALSE"
'a' is: FALSE, TRUE, FALSE, TRUE and
'b' is: TRUE, TRUE, FALSE, TRUE
[1] "'a && b' is: FALSE"
さらに、、は&&
、||
式が明確になるとすぐに停止します。
FALSE & a_not_existing_object
TRUE | a_not_existing_object
戻り値:
Error: object 'a_not_existing_object' not found
Error: object 'a_not_existing_object' not found
だが:
FALSE && a_not_existing_object
TRUE || a_not_existing_object
戻り値:
[1] FALSE
[1]真
ので何も後FALSE
と何か(およびTRUE
OR何かが)なりFALSE
とTRUE
それぞれ
のこの最後の動作は&&
、||
存在しない可能性のある要素の制御フローをチェックインする場合に特に役立ちます。
if (exists(a_not_existing_object) && a_not_existing_object > 42) {...}
このようにして、最初の式が評価された後に評価が停止FALSE
し、a_not_existing_object > 42
パーツは試行されません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加