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

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

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

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

使用 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

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] 正确

因为只测试了ab的第一个元素!

编辑:

考虑以下情况,我们在每个 && 测试后 'rotate' 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

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) 分别变为 FALSETRUE

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

if (exists(a_not_existing_object) && a_not_existing_object > 42) {...}

这样,在第一个表达式的计算结果为 FALSE 之后,计算 停止 并且 a_not_existing_object > 42 部分甚至不会被尝试!