【问题标题】:The difference between & and && in RR中&和&&的区别
【发布时间】:2014-02-10 04:47:59
【问题描述】:

我读过

http://stat.ethz.ch/R-manual/R-devel/library/base/html/Logic.html

& 和 && 之间的区别没有意义。例如:

> c(1, 2, 3) & c(1,2,3)
[1] TRUE TRUE TRUE

根据链接,这是预期的行为。它正在对两个向量进行逐元素比较。

所以我再次测试...

> c(1, 2, 3) && c(1,2,3)
[1] TRUE

这也返回了预期的结果。

但是我改变了一个值......

> c(1, 2, 3) && c(1,3,3)
[1] TRUE

仍然可以预期,因为它会在第一个元素上短路。

> c(1, 2, 3) & c(1,3,3)
[1] TRUE TRUE TRUE

然而,这让我失去了。这两个向量不应该相等。

【问题讨论】:

  • 你让我迷失在c(1, 2, 3) & c(1,2,3) 你能说一下你认为这是在评估什么吗?
  • 我从未见过& 以这种方式使用。我不认为这意味着等于,这就是== 的用途。这将为您提供预期的结果:c(1, 2, 3) == c(1,3,3)
  • x <- c(TRUE, FALSE)y <- c(FALSE, TRUE)z <- c(TRUE, TRUE)之类的东西替换你的向量,然后用x & yx && z玩一下,看看你现在能不能弄明白
  • 尽管在它周围玩耍似乎任何!= 0 都被视为TRUE,而任何== 0 都被视为FALSE。所以c(1, 2, 3) & c(1,3,0) 解释得更多。
  • @TylerRinker 事实上,这是一个不好的例子,可能是我一开始误解它的全部原因。

标签: r vector boolean logical-operators


【解决方案1】:

& 是一个逻辑运算符,因此 R 在比较之前将您的数量转换为逻辑值。对于数值,任何非 0(和非 NA/Null/NaN 的东西)的值都为 TRUE,而 0 的值为 FALSE。这么一说,还是有点道理的

> as.logical(c(1,2,3))
[1] TRUE TRUE TRUE
> as.logical(c(1,3,3))
[1] TRUE TRUE TRUE
> as.logical(c(1,2,3)) & as.logical(c(1,2,3))
[1] TRUE TRUE TRUE
> as.logical(c(1,2,3)) & as.logical(c(1,3,3))
[1] TRUE TRUE TRUE

【讨论】:

    【解决方案2】:

    考虑到这一点,那就应该清楚了:

    as.logical(c(0,1,2,3,4))
    #[1] FALSE  TRUE  TRUE  TRUE  TRUE
    

    所以...

    c(1,2,3) & c(1,3,3)
    #[1] TRUE TRUE TRUE
    

    相当于:

    c(TRUE,TRUE,TRUE) & c(TRUE,TRUE,TRUE)
    

    ...使用&按元素进行比较并返回c(TRUE,TRUE,TRUE)

    供参考:

    test <- c(NA,NaN,-Inf,-1,-0.5,0,0.5,1,2,Inf)
    data.frame(test,as.logical(test))
    
    #   test as.logical.test.
    #1    NA               NA
    #2   NaN               NA
    #3  -Inf             TRUE
    #4  -1.0             TRUE
    #5  -0.5             TRUE
    #6   0.0            FALSE
    #7   0.5             TRUE
    #8   1.0             TRUE
    #9   2.0             TRUE
    #10  Inf             TRUE
    

    【讨论】:

    • 特别是,&amp; 在评估为 numeric 时不会检查向量是否相等。
    【解决方案3】:

    当向量长度相等时,“&”运算符只是逐个元素的逻辑与。这就是为什么你也应该期待这个结果:

     c(0,1,2,3,4) & 1
    [1] FALSE  TRUE  TRUE  TRUE  TRUE  # due to argument recycling
    

    请注意,它不是比较数值,而是在强制键入“逻辑”之后,任何非零值都将为 TRUE:

    seq(0,1,by=.2) & -1
    [1] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE
    

    "&&" 仅将其第一个参数的第一个元素与第二个参数的第一个元素进行比较,如果其中一个元素长于单个元素,则会发出警告(但不是错误)。

    如果您想测试是否相等,请使用“==”。

    【讨论】:

    • 带有关于使用 == 和浮点数的常见警告。
    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 2011-04-16
    • 2017-08-10
    • 2014-02-02
    • 2015-05-13
    • 1970-01-01
    • 2016-01-10
    • 2021-10-04
    相关资源
    最近更新 更多