在 R 编程中,& 与 && 和 | 之间有什么区别?对||

use*_*754 2 r boolean-expression booleanquery

我知道 && 和 || 的部分 编写更高效的代码,因为它们在链中进行的测试次数最少,并且一旦我们有足够的信息知道链的结果将是什么,就会立即爆发。

  • 只要 && 在链中遇到 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
Run Code Online (Sandbox Code Playgroud)

使用anyand将运算符任一侧的向量折叠为一个布尔值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
Run Code Online (Sandbox Code Playgroud)

dar*_*rio 6

他们只能在操作员的每一侧处理一个逻辑测试

a <- c(T, F, F, F)
b <- c(T, F, F, F)
a && b
Run Code Online (Sandbox Code Playgroud)

返回 [1] TRUE

因为只有aand的第一个元素b被测试了!

编辑:

考虑以下,我们“旋转”的地方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])
}
Run Code Online (Sandbox Code Playgroud)

给我们:

'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"
Run Code Online (Sandbox Code Playgroud)

此外, &&,||一旦表达式清晰就停止:

FALSE & a_not_existing_object
TRUE | a_not_existing_object
Run Code Online (Sandbox Code Playgroud)

返回:

Error: object 'a_not_existing_object' not found
Error: object 'a_not_existing_object' not found
Run Code Online (Sandbox Code Playgroud)

但:

FALSE && a_not_existing_object
TRUE || a_not_existing_object
Run Code Online (Sandbox Code Playgroud)

返回:

[1] 错误

[1] 真

因为AND之后的任何事物(和OR事物)分别变为和FALSE TRUE FALSETRUE

如果要检查可能不存在的元素的控制流,则&&and 的最后一个行为||特别有用:

if (exists(a_not_existing_object) && a_not_existing_object > 42) {...}
Run Code Online (Sandbox Code Playgroud)

这样,在第一个表达式计算为 之后,计算就停止FALSEa_not_existing_object > 42甚至没有尝试过该部分!