根据R language definition,&
和&&
(相应地|
和||
)之间的区别在于前者是矢量化的,而后者不是。
根据the help text,我读到的差异类似于“And”和“AndAlso”(相应地“Or”和“OrElse”)之间的差异...含义:并非所有的评估,如果他们不一定是(即 A 或 B 或 C 始终是真实的,如果 A 是真的,所以停止评估,如果 A 是真的)
有人可以在这里发光吗?另外,R 中有 AndAlso 和 OrElse 吗?

较短的是矢量化的,这意味着他们可以返回一个向量,像这样:
((-2:2) >= 0) & ((-2:2) <= 0)
# [1] FALSE FALSE TRUE FALSE FALSE
较长的形式评估从左到右只检查每个向量的第一个元素,所以上面给出
((-2:2) >= 0) && ((-2:2) <= 0)
# [1] FALSE
正如帮助页面所说,这使得较长的形式“适合于编程控制流,并且 [是] 通常在 if 子句中首选”。
所以你想使用长形式只有当你确定向量的长度为一。
您应该绝对确定您的向量仅长度为 1,例如在它们是仅返回长度为 1 的布尔值的函数的情况下。如果向量的长度可能为 & gt;1,则要使用短形式。因此,如果您不确定,则应首先检查,或使用短形式,然后使用all
和any
将其长度减少为
函数all
和any
通常用于矢量化比较的结果,以分别查看所有或任何比较是否为真。这些函数的结果肯定长度为 1,因此它们适合在 if 子句中使用,而矢量化比较的结果则不适合。(尽管这些结果适合在ifelse
中使用。
最后一个区别:&&
和||
只评估它们需要的数量(这似乎是短路的意思)。例如,这里使用未定义的值a
进行比较;如果它没有短路,因为&
和|
没有,它会给出错误。
a
# Error: object 'a' not found
TRUE || a
# [1] TRUE
FALSE && a
# [1] FALSE
TRUE | a
# Error: object 'a' not found
FALSE & a
# Error: object 'a' not found
最后,请参见The R Inferno中标题为“and and and”的 8.2.17 节。

然后关于"short-circuiting"的答案可能会产生误导,但有一些道理(见下文)。在 R / S 语言中,&&
和||
仅评估第一个参数中的第一个元素。无论第一个值如何,都将忽略向量或列表中的所有其他元素。这些运算符旨在与if (cond) {} else{}
构造一起使用,并指导程序控制。
当评估&&
或||
的参数时,存在“短路”,因为如果从左到右连续的任何值是确定性的,则评估停止并返回最终值。
> if( print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 2
> if(FALSE && print(1) ) {print(2)} else {print(3)} # `print(1)` not evaluated
[1] 3
> if(TRUE && print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 2
> if(TRUE && !print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 3
> if(FALSE && !print(1) ) {print(2)} else {print(3)}
[1] 3
短路的优势只有在参数需要很长时间计算时才会出现。当参数是处理更大对象或具有更复杂的数算的函数时,通常会发生这种情况。

&&
和||
是所谓的“短路”。这意味着如果第一个操作数足以确定表达式的值,则它们将不计算第二个操作数。
例如,如果&&
的第一个操作数为 false,则评估第二个操作数没有意义,因为它不能更改表达式的值(false && true
和false && false
都为 false)。
您可以在这里阅读更多关于此的内容:://en..org/wiki/Short-circuit_evaluation从该页面上的表格中可以看到&&
等同于 VB.NET 中的AndAlso
,我假设您指的是。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(24条)