use*_*754 2 r boolean-expression booleanquery
我知道 && 和 || 的部分 编写更高效的代码,因为它们在链中进行的测试次数最少,并且一旦我们有足够的信息知道链的结果将是什么,就会立即爆发。
但是我在 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)
使用any
and将运算符任一侧的向量折叠为一个布尔值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)
他们只能在操作员的每一侧处理一个逻辑测试
a <- c(T, F, F, F)
b <- c(T, F, F, F)
a && b
Run Code Online (Sandbox Code Playgroud)
返回 [1] TRUE
因为只有a
and的第一个元素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])
}
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
FALSE
TRUE
如果要检查可能不存在的元素的控制流,则&&
and 的最后一个行为||
特别有用:
if (exists(a_not_existing_object) && a_not_existing_object > 42) {...}
Run Code Online (Sandbox Code Playgroud)
这样,在第一个表达式计算为 之后,计算就停止了FALSE
,a_not_existing_object > 42
甚至没有尝试过该部分!