[英]In R programming, what's the difference between & vs &&, and | vs ||
我知道 && 和 || 的部分編寫更高效的代碼,因為它們在鏈中進行的測試次數最少,並且一旦我們有足夠的信息知道鏈的結果將是什么,就會立即爆發。
但是我在 Garrett Grolemund 的書中讀到“...雙運算符並不適用於所有地方。&& 和 || 不是矢量化的,這意味着它們只能在運算符的每一側處理單個邏輯測試......”有人可以嗎向我解釋強調的部分是什么意思?
做了一些簡單的測試,而 & 在兩個邏輯向量的相應元素之間進行逐元素比較時,&& 只比較第一個元素並返回 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
和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
他們只能在操作員的每一側處理一個邏輯測試
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] 錯誤
[1] 真
因為在FALSE
AND東西(和TRUE
OR東西)之后的任何東西分別變成FALSE
和TRUE
&&
和||
最后一個行為如果要檢查可能不存在的元素的控制流,則特別有用:
if (exists(a_not_existing_object) && a_not_existing_object > 42) {...}
這樣,在第一個表達式的計算結果為FALSE
之后計算停止,並且a_not_existing_object > 42
部分甚至沒有嘗試!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.