2014-03-07 202 views

回答

2

|是矢量化,||不(只着眼於第一個元素):

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

此外,|||保留他們在其他語言中有各自的屬性,意思||的評價是短路的,而|的不是:

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

雖然這是真的,這不是唯一的區別(見這個問題一式兩份)。 –

+0

@JoshuaUlrich補充道。 –

5

要到幫助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 
+0

沒問題。我恢復了反對票。我要刪除我的評論。 –

相關問題