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)
当向量长度相等时,"&"运算符只是元素与元素的逻辑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)
"&&"仅将第一个参数的第一个元素与第二个参数的第一个参数进行比较,并且如果任何一个元素长于单个元素,则发出警告(但不是错误).
如果要测试相等性,请使用"==".