簡體   English   中英

在 R 編程中,& 與 && 和 | 之間有什么區別? 對||

[英]In R programming, what's the difference between & vs &&, and | vs ||

我知道 && 和 || 的部分編寫更高效的代碼,因為它們在鏈中進行的測試次數最少,並且一旦我們有足夠的信息知道鏈的結果將是什么,就會立即爆發。

  • 只要 && 在鏈中遇到 FALSE,它就會停止評估並為整個鏈返回 FALSE。
  • 一旦|| 在鏈中命中 TRUE 它停止評估並為鏈返回 TRUE

但是我在 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

使用anyall將運算符任一側的向量折疊為一個布爾值。

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

因為只測試了ab的第一個元素!

編輯:

考慮以下情況,我們在每個&&測試后“旋轉” ab

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東西)之后的任何東西分別變成FALSETRUE

&&||最后一個行為如果要檢查可能不存在的元素的控制流,則特別有用:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM