R中 | 和 || 的区别

3

我得承认我是一个初学者,但我不理解这两个运算符之间的区别。我读了下面的内容,但我有困难:

"较短的形式以与算术运算符类似的方式执行逐元素比较。较长的形式从左到右评估,仅检查每个向量的第一个元素。只有在确定结果时才进行评估。较长的形式适用于编程控制流,并且通常在 if 子句中使用。"

为什么第二种形式更为合适?


5
你能做的最好的事情就是自己实验,看看每个操作符对标量和向量的作用是如何的。要让内容易于理解,不改变原意。 - Carl Witthoft
3个回答

4
第二种形式适用于短路,可以避免在第二个(或更长语句中的后续条件)计算或出错时进行冗长的计算。
特别地,
condition || lengthyComputation()

如果conditionTRUE,问题将迅速解决。例如:

system.time(TRUE || {Sys.sleep(1);TRUE})
   user  system elapsed 
      0       0       0 
system.time(FALSE || {Sys.sleep(1);TRUE})
   user  system elapsed 
      0       0       1 

4

short函数对向量进行逐元素操作,并返回与输入向量大小相同的向量。如果需要,它会循环使用较短的向量:

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

长格式只考虑每个向量的第一个元素,并返回一个长度为一的逻辑向量。
> c(FALSE, FALSE) || c(FALSE, TRUE, FALSE)
[1] FALSE

通常情况下,当你需要一个if语句时,你需要一个长度为一的逻辑向量作为条件。由于||比|更快,因此应该优先选择这个版本。

4
请考虑添加一个使用 if 语句来说明差异的例子。 - Mark Miller

-2

控制流语句期望条件为布尔值(或可转换为布尔值的内容)。 第一个运算符|不返回布尔值,而是返回布尔向量,因此不适合用于条件判断。而||运算符返回布尔值,因此适合用于控制流语句。


在 R 中(几乎)所有东西都是向量。而 || 的返回值是一个长度为1的逻辑(原子)向量。 - Roland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接