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

myn*_*EFF 0 r

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

谢谢

Kon*_*lph 11

运算符/和/之间存在三个相关差异,官方文档中对此进行了解释。这里\xe2\x80\x99s是一个总结:&&||&|

\n

1.&|矢量化

\n

这意味着如果您想对向量执行按元素逻辑运算,您应该使用&and |

\n
a = c(TRUE, TRUE, FALSE, FALSE)\nb = c(TRUE, FALSE, TRUE, FALSE)\n\na | b\n# [1]  TRUE  TRUE  TRUE FALSE\n\na || b\n# Error in a || b : \'length = 4\' in coercion to \'logical(1)\'\n
Run Code Online (Sandbox Code Playgroud)\n

在以前版本的 R 中,a || b( 和a && b) 不会导致错误。相反,这些操作会默默地截断输出(仅返回第一个元素;在导致此错误之前,它会在 R 4.2 中短暂引发警告)。

\n

2.&&||短路

\n

短路意味着仅当左侧尚未确定结果时才计算表达式的右侧。几乎每种编程语言都对条件操作执行此操作,因为它在编写if条件时会产生方便的习惯用法,例如:

\n
if (length(x) > 0L && x[1L] == 42) \xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n

此代码依赖于短路:如果没有它,如果为x空,则代码将失败,因为右侧尝试访问不存在的元素。如果没有短路,我们将不得不使用嵌套if块,从而导致更冗长的代码:

\n
if (length(x) > 0L) {\n    if (x[1L] == 42) \xe2\x80\xa6\n}\n
Run Code Online (Sandbox Code Playgroud)\n

作为一般规则,在条件表达式 ( if, while) 中,您应该始终使用&&and ||,即使不需要短路:它更惯用,并导致更统一的代码。

\n

3.&可以|进行按位运算

\n

在许多(大多数?)编程语言中,&实际上|执行按位算术而不是布尔算术。即,对于两个整数aba & b计算按位与,并a | b计算按位或。对于布尔值,按位运算和逻辑运算之间没有区别;但对于任意整数,结果不同。例如,1 | 2 == 3在大多数编程语言中。

\n

然而,对于 R 来说情况并非&如此:R 将和 的数字参数强制转换|为逻辑值并执行布尔算术。

\n

\xe2\x80\xa6 除非两个参数都是类型raw

\n
c(1, 3) | c(2, 4)\n# [1] TRUE TRUE\n\nas.raw(c(1, 3)) | as.raw(c(2, 4))\n# [1] 03 07\n
Run Code Online (Sandbox Code Playgroud)\n

值得注意的是,当使用参数调用时,操作!(逻辑非)也会执行按位算术。xorraw

\n


Sil*_*ish 7

要获得R中逻辑运算符的帮助,您必须这样做

?`|`
Run Code Online (Sandbox Code Playgroud)

要么

?`||`
Run Code Online (Sandbox Code Playgroud)

这两个都会带您到相应的帮助页面http://stat.ethz.ch/R-manual/R-patched/library/base/html/Logic.html

在您将矢量放入或未正确评估的内容之前,您不会注意到差异:

> T|F
[1] TRUE
> T||F
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

但是当你使用矢量时:

> 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
Run Code Online (Sandbox Code Playgroud)

同样用&&&:

> 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
Run Code Online (Sandbox Code Playgroud)

因此|,&比较两个向量中相应位置的元素,并使用它来填充新的逻辑向量.如果一个向量比另一个向量短,则其元素从一开始就被" 回收 ":

> 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
Run Code Online (Sandbox Code Playgroud)

请注意,||&&只看向量的第一个元素,所以比如:

> 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
Run Code Online (Sandbox Code Playgroud)

对于无法评估的输入,||并且&&更聪明:它们从左到右"短路".如果左侧输入||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
Run Code Online (Sandbox Code Playgroud)

如果您想要安全地检查某些内容,这非常有用:

> (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
Run Code Online (Sandbox Code Playgroud)