【问题标题】:Difference between | and || in R [duplicate]之间的区别 |和 ||在 R [重复]
【发布时间】:2013-11-21 13:23:27
【问题描述】:

我必须承认我是一个大新手,但我不明白这两个运营商之间的区别。我阅读了以下内容,但我无法理解:

“较短的形式执行元素比较的方式与算术运算符大致相同。较长的形式从左到右评估,仅检查每个向量的第一个元素。评估仅在确定结果之前进行。较长的形式适用于编程控制流,通常在 if 子句中首选。"

为什么第二种形式更合适?

【问题讨论】:

  • 您能做的最好的事情就是自己试验,看看这些运算符中的每一个如何作用于标量和向量。

标签: r operators


【解决方案1】:

第二种形式对short-circuiting 很有用,可能避免在第二种(或后续更长的语句)条件下进行冗长的计算或错误。

特别是,

condition || lengthyComputation()

如果condition 成为TRUE,将很快解决。例如,

system.time(TRUE || {Sys.sleep(1);TRUE})
   user  system elapsed 
      0       0       0 
system.time(FALSE || {Sys.sleep(1);TRUE})
   user  system elapsed 
      0       0       1 

【讨论】:

    【解决方案2】:

    short 对向量按元素进行操作,并返回与输入向量大小相同的向量。如有必要,它会回收较短的向量:

    > c(FALSE, FALSE) | c(TRUE, FALSE)
    [1]  TRUE FALSE
    

    long 形式只考虑每个 vecotr 的第一个元素,并返回一个长度为一的逻辑向量。

    > c(FALSE, FALSE) || c(FALSE, TRUE, FALSE)
    [1] FALSE
    

    通常,只要有 if 语句,就需要长度为 1 的逻辑向量作为条件。由于||| 快​​,所以应该首选这个版本。

    【讨论】:

    • 请考虑包含一个使用if-statement 的示例来说明差异。
    【解决方案3】:

    控制流语句期望条件是布尔值(或可以转换为布尔值的东西)。 第一个运算符| 不返回布尔值,而是返回布尔值向量,因此不打算在条件中使用。 || 运算符返回一个布尔值,使其适用于控制流。

    【讨论】:

    • 在 R 中(几乎)一切都是向量。而||的返回值是一个长度为1的逻辑(原子)向量。
    猜你喜欢
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 2011-04-08
    • 2012-11-24
    • 2013-06-05
    • 2021-09-29
    • 2020-05-27
    相关资源
    最近更新 更多