0
A
回答
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
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
沒問題。我恢復了反對票。我要刪除我的評論。 –
相關問題
- 1. 在R中,class ts和class timeSeries之間有什麼區別?
- 2. 有什麼區別:。!和:r!?
- 3. 「層」和「層」之間有什麼區別?
- 4. Tableau和QlikView之間有什麼區別
- 5. Microsoft.CompilerServices.AsyncTargetingPack和Microsoft.Bcl.Async之間有什麼區別?
- 6. @Entity和@embeddable之間有什麼區別
- 7. ContentObservable和DataSetObservable之間有什麼區別?
- 8. touchmove和gesturechange之間有什麼區別?
- 9. :notification.flags和notification.defaults之間有什麼區別?
- 10. proc和lambda之間有什麼區別?
- 11. :: after和after之間有什麼區別?
- 12. read()和io.read()之間有什麼區別?
- 13. Request()和Request.Form()之間有什麼區別?
- 14. WebServiceBinding.EmitConformanceClaims和WebServiceBinding.ConformanceClaims之間有什麼區別?
- 15. getA()和this.getA()之間有什麼區別?
- 16. (int)和intval()之間有什麼區別?
- 17. set_value和= pandas之間有什麼區別
- 18. * zoom和zoom之間有什麼區別?
- 19. {0}和「」之間有什麼區別?
- 20. typedef和using之間有什麼區別?
- 21. 「」和「'之間有什麼區別?
- 22. STDIN和tty之間有什麼區別?
- 23. +和%之間有什麼區別?
- 24. sysfs_create_file()和sysfs_create_group()之間有什麼區別?
- 25. Lazy.Force()和Lazy.Value之間有什麼區別
- 26. -existingObjectWithID:error:和-objectWithID之間有什麼區別?
- 27. ReleaseFloatArrayElements和DeleteLocalRef之間有什麼區別
- 28. AutomationProperties.AutomationID和AutomationProperties.Name之間有什麼區別?
- 29. gets()和getc()之間有什麼區別?
- 30. _id:ObjectID和String之間有什麼區別?
雖然這是真的,這不是唯一的區別(見這個問題一式兩份)。 –
@JoshuaUlrich補充道。 –