R中&和&&之间的区别

Joh*_*ohn 5 boolean r vector logical-operators

我读过了

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
Run Code Online (Sandbox Code Playgroud)

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

所以我再次测试......

> c(1, 2, 3) && c(1,2,3)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

这也回归了预期.

但后来我换了一个值......

> c(1, 2, 3) && c(1,3,3)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

仍然期待,因为它在第一个元素上短路.

> c(1, 2, 3) & c(1,3,3)
[1] TRUE TRUE TRUE
Run Code Online (Sandbox Code Playgroud)

然而这让我失望了.这两个向量不应该相等.

Das*_*son 12

&是一个逻辑运算符,因此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
Run Code Online (Sandbox Code Playgroud)


the*_*ail 10

考虑一下,那么应该清楚:

as.logical(c(0,1,2,3,4))
#[1] FALSE  TRUE  TRUE  TRUE  TRUE
Run Code Online (Sandbox Code Playgroud)

所以...

c(1,2,3) & c(1,3,3)
#[1] TRUE TRUE TRUE
Run Code Online (Sandbox Code Playgroud)

相当于:

c(TRUE,TRUE,TRUE) & c(TRUE,TRUE,TRUE)
Run Code Online (Sandbox Code Playgroud)

...通过元素使用&和返回进行比较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
Run Code Online (Sandbox Code Playgroud)


42-*_*42- 7

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

 c(0,1,2,3,4) & 1
[1] FALSE  TRUE  TRUE  TRUE  TRUE  # due to argument recycling
Run Code Online (Sandbox Code Playgroud)

请注意,它不是在比较数值,而是仅在强制之后键入"logical",并且任何非零值都将为TRUE:

seq(0,1,by=.2) & -1
[1] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE
Run Code Online (Sandbox Code Playgroud)

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

如果要测试相等性,请使用"==".