||之间有什么区别?和|在R?

时间:2014-03-07 13:48:47

标签: r

我知道“||”在大多数编程语言中表示“或”,包括R.但有时候我会看到人们使用“|”。而且我不完全确定这意味着什么。它与“||”有什么不同?

由于

2 个答案:

答案 0 :(得分:6)

要获得R中逻辑运算符的帮助,您必须执行

?`|`

?`||`

两者都会带您进入相应的帮助页http://stat.ethz.ch/R-manual/R-patched/library/base/html/Logic.html

在你将矢量放入或者没有正确评估的东西之前,你不会注意到差异:

> T|F
[1] TRUE
> T||F
[1] TRUE

但是当你使用矢量时:

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

&&&类似:

> c(T,T,F,F) & c(T,F,T,F)
[1]  TRUE FALSE FALSE FALSE
> c(T,T,F,F) && c(T,F,T,F)
[1] TRUE

因此|&比较两个向量中相应位置的元素,并使用它来填充新的逻辑向量。如果一个向量比另一个向量短,则其元素从一开始就变为“recycled”:

> c(T, F, T, F) | c(T, T, F, F, T, F) #first 2 elements of left vector recycled
[1]  TRUE  TRUE  TRUE FALSE  TRUE FALSE
Warning message:
In c(T, F, T, F) | c(T, T, F, F, T, F) :
  longer object length is not a multiple of shorter object length
> c(T, F, T, F, T, F) | c(T, T, F, F, T, F) #what actually got evaluated
[1]  TRUE  TRUE  TRUE FALSE  TRUE FALSE

请注意,||&&仅查看向量的第一个元素,例如:

> c(T,T,T,T) && c(F,T,T,T) #only does T & F
[1] FALSE
> c(F,T,T,T) || c(F,T,T,T) #only does F | F
[1] FALSE
> c(T,F,F,F) && c(T,F,F,F) #only does T & T
[1] TRUE
> c(T,F,F,F) || c(F,F,F,F) #only does F | F
[1] TRUE

对于无法评估的输入,||&&更加明确:它们从左到右“短路”。如果||的左侧输入为TRUE(结果必须为TRUE),或&&的左侧输入为FALSE(所以结果必须是FALSE),然后无需评估右手输入。

> x
Error: object 'x' not found
> exists("x")
[1] FALSE
> F & x # evaluates right input, fails
Error: object 'x' not found
> F && x # skips right input, already knows result F
[1] FALSE
> T && x # can't skip right input, so fails
Error: object 'x' not found
> T | x
Error: object 'x' not found
> T || x # skips right input, already knows result T
[1] TRUE

如果你想安全地检查一下,这很有用:

> (x > 20)
Error: object 'x' not found
> exists("x") & (x > 20) # still evaluated right input, fails
Error: object 'x' not found
> exists("x") && (x > 20) # safe
[1] FALSE

答案 1 :(得分:2)

|是矢量化的,||不是(它只查看第一个元素):

> a = c(TRUE, TRUE, FALSE, FALSE)
> b = c(TRUE, FALSE, TRUE, FALSE)
> a | b
[1]  TRUE  TRUE  TRUE FALSE
> a || b
[1] TRUE

此外,|||会保留其他语言中的相应属性,这意味着||的评估会被短路而|的isn' T:

> f = function() { cat('f\n'); TRUE }
> f() || f()
f
[1] TRUE
> f() | f()
f
f
[1] TRUE