R中|和|之间的差异

R中|和|之间的差异,r,operators,R,Operators,我必须承认,我是一个大菜鸟,但我不理解这两个操作员之间的区别。我读了以下内容,但我很难理解: “较短的形式执行元素级比较的方式与算术运算符基本相同。较长的形式从左到右求值,只检查每个向量的第一个元素。求值只在确定结果之前进行。较长的形式适用于控制流编程,通常在if子句中首选。” 为什么第二种形式更合适?第二种形式有助于避免在第二种(或后续更长的语句)情况下出现冗长的计算或错误 特别是, condition || lengthyComputation() 如果条件为真,将快速解决。比如说, sy

我必须承认,我是一个大菜鸟,但我不理解这两个操作员之间的区别。我读了以下内容,但我很难理解:

“较短的形式执行元素级比较的方式与算术运算符基本相同。较长的形式从左到右求值,只检查每个向量的第一个元素。求值只在确定结果之前进行。较长的形式适用于控制流编程,通常在if子句中首选。”


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

第二种形式有助于避免在第二种(或后续更长的语句)情况下出现冗长的计算或错误

特别是,

condition || lengthyComputation()
如果
条件
,将快速解决。比如说,

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 

short对向量进行元素操作,并返回与输入向量大小相同的向量。如有必要,它将回收较短的向量:

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

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

通常,只要有if语句,就需要一个长度为1的逻辑向量作为条件。由于
|
|
快,因此应首选此版本

控制流语句期望条件是布尔值(或可以转换为它的东西)。
第一个运算符
|
不返回布尔值,而是返回布尔向量,因此不打算在条件中使用。<代码> < <代码> >操作符返回一个布尔值,使其适合于控制流。

最好的办法是自己做实验,看看这些运算符是如何作用于标量和向量的。请考虑使用一个例子,使用<代码>如果-语句来说明差异。在R(几乎)中一切都是向量。
|
的返回值是长度为1的逻辑(原子)向量。