布尔运算符 & &和| |(i vs r)

根据R language definition,&和&&(相应地|和||)之间的区别在于前者是矢量化的,而后者不是。

根据R language definition&&&(相应地|||)之间的区别在于前者是矢量化的,而后者不是。

根据the help text,我读到的差异类似于“And”和“AndAlso”(相应地“Or”和“OrElse”)之间的差异...含义:并非所有的评估,如果他们不一定是(即 A 或 B 或 C 始终是真实的,如果 A 是真的,所以停止评估,如果 A 是真的)

有人可以在这里发光吗?另外,R 中有 AndAlso 和 OrElse 吗?

410

较短的是矢量化的,这意味着他们可以返回一个向量,像这样:

((-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,则要使用短形式。因此,如果您不确定,则应首先检查,或使用短形式,然后使用allany将其长度减少为

函数allany通常用于矢量化比较的结果,以分别查看所有或任何比较是否为真。这些函数的结果肯定长度为 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 节。

47

然后关于"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

短路的优势只有在参数需要很长时间计算时才会出现。当参数是处理更大对象或具有更复杂的数算的函数时,通常会发生这种情况。

30

&&||是所谓的“短路”。这意味着如果第一个操作数足以确定表达式的值,则它们将不计算第二个操作数。

例如,如果&&的第一个操作数为 false,则评估第二个操作数没有意义,因为它不能更改表达式的值(false && truefalse && false都为 false)。

您可以在这里阅读更多关于此的内容:://en..org/wiki/Short-circuit_evaluation从该页面上的表格中可以看到&&等同于 VB.NET 中的AndAlso,我假设您指的是。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(95)
Plaid-error_code:'ITEM_LOGIN_REQUIRED'。每小时左右重复一次
上一篇
如何将此TensorFlow图像分类模型转换为Core ML
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(24条)