我读了很多关于逻辑运算符的短形式和长形式之间的区别的帖子,但我需要明确的精度。
我读到了:
较长的形式从左到右计算,仅检查每个向量的第一个元素。
那么,是这样的吗:
c(TRUE, TRUE) && c(TRUE, NA)
与此完全相同的操作:
(c(TRUE, TRUE) & c(TRUE, NA))[1]
第一个向量的第一个元素与第二个向量的第一个元素之间的逻辑 & 的结果?
如果这是正确的,那么仅返回每个向量的第一个元素之间的逻辑运算符返回的值有什么意义?
我认为它不应该与向量一起使用?
?'&&'
给出您想要较长形式的位置:
The longer form is appropriate for programming control-flow and typically
preferred in if clauses.
if
采用单个值。 不幸的是,如果向量超过长度 1,&&
不会发出警告(if
确实发出警告),因此很难发现这样的错误。
确实,您不应该将
&&
与长度不是 1 的向量一起使用。
我认为更详细的讨论可能会有所帮助,特别是因为 R 处理逻辑运算符的方式发生了相当大的变化。
首先,“简写形式”
&
和 |
按元素进行操作。例如,c(T,F) & c(F,T)
将计算为 [1] FALSE FALSE
。这符合 R 中一般的“向量元素运算”范例。
“长形式”是一个拼凑,旨在弥合上述范式与
if
(和while
)需要一个单个逻辑值作为其参数这一事实之间的差距。 (if (c(T,F)) { ... }
确实没有意义,不是吗?)。
“长形式拼凑”通过指定
&&
和 ||
运算符仅作用于其参数的 first 元素来解决这个问题。 4.1 版本之前都是这种情况。
在版本 4.2 中,“长形式”逻辑运算符的行为发生了变化,如果参数的长度 >1,它们会打印警告。发行说明说:
- 调用 && 或 ||任一参数的长度大于 1 现在给出警告(它的目的将成为 [原文如此!] 错误)。
从版本 4.3 开始,这变成了一个错误:
调用 && 或 || LHS 或(如果评估)RHS 的长度更大 现在总是一个错误,并带有以下形式的报告
'length = 4' in coercion to 'logical(1)' Environment variable _R_CHECK_LENGTH_1_LOGIC2_ no longer has any effect.
这对程序员来说更加友好,但您仍然必须记住在
if(...)
或 while(...)
子句中使用“长格式”。