R中的| |和|有什么区别?

R中的| |和|有什么区别?,r,R,我知道| |在包括R在内的大多数编程语言中都表示或。但有时我看到人们使用|。我也不完全确定这意味着什么。它与| |有何不同 谢谢|是矢量化的,| |不是只看第一个元素吗: > a = c(TRUE, TRUE, FALSE, FALSE) > b = c(TRUE, FALSE, TRUE, FALSE) > a | b [1] TRUE TRUE TRUE FALSE > a || b [1] TRUE 此外,| |和|保留它们在其他语言中的各自属性,这意味着|

我知道| |在包括R在内的大多数编程语言中都表示或。但有时我看到人们使用|。我也不完全确定这意味着什么。它与| |有何不同

谢谢

|是矢量化的,| |不是只看第一个元素吗:

> 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
|是矢量化的,| |不是只看第一个元素吗:

> 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

要获得R中逻辑运算符的帮助,必须执行以下操作

?`|`

这两个选项都会将您带到相应的帮助页面

你不会注意到有什么不同,除非你加入了一个向量,或者是一些计算不正确的东西:

> 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
与&和&&类似:

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

> 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
对于无法计算的输入,| |和&&更聪明:它们从左到右短路。如果左输入的| |为真,则结果必须为真;如果左输入的&&为假,则结果必须为假,则无需计算右输入

> 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

要获得R中逻辑运算符的帮助,必须执行以下操作

?`|`

这两个选项都会将您带到相应的帮助页面

你不会注意到有什么不同,除非你加入了一个向量,或者是一些计算不正确的东西:

> 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
与&和&&类似:

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

> 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
对于无法计算的输入,| |和&&更聪明:它们从左到右短路。如果左输入的| |为真,则结果必须为真;如果左输入的&&为假,则结果必须为假,则无需计算右输入

> 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

@JoshuaUlrich我随机回到这个答案,我意识到我不知道你的评论是什么意思:我提到矢量化和短路……还有什么?@JoshuaUlrich好的,我想可能还有其他东西。我对你的记忆表示哀悼-@JoshuaUlrich我随机回到这个答案,我意识到我不知道你的评论是什么意思:我提到矢量化和短路……还有什么?@JoshuaUlrich好的,我想可能还有其他东西。我对你的记忆表示哀悼-