在 R 编程中,& 与 && 和 | 之间有什么区别?与 ||
In R programming, what's the difference between & vs &&, and | vs ||
我知道 && 和 || 的部分制作更高效的代码,因为它们在链中进行的测试次数最少,并且一旦我们有足够的信息知道链的结果将是什么,它们就会中断。
- 一旦 && 在链中遇到 FALSE,它就会停止评估,并且 returns 整个链都为 FALSE。
- 尽快||在它停止评估的链中命中 TRUE 并且链 returns TRUE
但我在 Garrett Grolemund 的 book 中读到“......双重运算符并不适用于任何地方。&& 和 || 未向量化,这意味着它们 只能处理单个逻辑在运算符的每一侧进行测试..."有人可以向我解释强调的部分是什么意思吗?
做了一些简单的测试,当 & 在两个逻辑向量的相应元素之间进行逐元素比较时,&& 只比较第一个元素并返回 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
they can only handle a single logical test on each side of the operator
a <- c(T, F, F, F)
b <- c(T, F, F, F)
a && b
Returns
[1] 正确
因为只测试了a
和b
的第一个元素!
编辑:
考虑以下情况,我们在每个 &&
测试后 'rotate' 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
Returns:
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
Returns:
[1] 错误
[1] 正确
因为 在 FALSE
AND 之后(和 TRUE
OR something) 分别变为 FALSE
和 TRUE
如果您想检查控制流中可能不存在的元素,&&
和 ||
的最后一个行为特别有用:
if (exists(a_not_existing_object) && a_not_existing_object > 42) {...}
这样,在第一个表达式的计算结果为 FALSE
之后,计算 停止 并且 a_not_existing_object > 42
部分甚至不会被尝试!
我知道 && 和 || 的部分制作更高效的代码,因为它们在链中进行的测试次数最少,并且一旦我们有足够的信息知道链的结果将是什么,它们就会中断。
- 一旦 && 在链中遇到 FALSE,它就会停止评估,并且 returns 整个链都为 FALSE。
- 尽快||在它停止评估的链中命中 TRUE 并且链 returns TRUE
但我在 Garrett Grolemund 的 book 中读到“......双重运算符并不适用于任何地方。&& 和 || 未向量化,这意味着它们 只能处理单个逻辑在运算符的每一侧进行测试..."有人可以向我解释强调的部分是什么意思吗?
做了一些简单的测试,当 & 在两个逻辑向量的相应元素之间进行逐元素比较时,&& 只比较第一个元素并返回 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
they can only handle a single logical test on each side of the operator
a <- c(T, F, F, F)
b <- c(T, F, F, F)
a && b
Returns [1] 正确
因为只测试了a
和b
的第一个元素!
编辑:
考虑以下情况,我们在每个 &&
测试后 'rotate' 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
Returns:
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
Returns:
[1] 错误
[1] 正确
因为 在 FALSE
AND 之后(和 TRUE
OR something) 分别变为 FALSE
和 TRUE
如果您想检查控制流中可能不存在的元素,&&
和 ||
的最后一个行为特别有用:
if (exists(a_not_existing_object) && a_not_existing_object > 42) {...}
这样,在第一个表达式的计算结果为 FALSE
之后,计算 停止 并且 a_not_existing_object > 42
部分甚至不会被尝试!