【发布时间】:2015-07-06 02:11:00
【问题描述】:
是的,我知道,关于在 R 中使用 & 与 && 有很多问题(例如,请参阅 this one),但我还没有找到一个专门回答我的问题的问题。
据我了解,
-
&进行元素方面的矢量化比较,就像其他算术运算一样。因此,如果两个参数的长度 > 1,它就会返回一个长度 > 1 的逻辑向量。 -
&&比较两个向量的第一个元素并始终返回长度为 1 的结果。此外,它会短路:cond1 && cond2 && cond3 && ...仅在cond1为TRUE时评估cond2,等等。这允许使用if(exists("is.R") && is.function(is.R) && is.R())之类的东西,特别是意味着在某些情况下使用&&是绝对必要的。
此外,if 发出警告
条件的长度 > 1,并且只使用第一个元素
如果它的条件有多个元素。
从这些初步情况来看,我认为在所有不需要短路的if 语句中,首选& 而不是&& 更安全。
如果在计算过程中出现问题并且我不小心在& 的一个参数中包含了一个向量,我会收到一个警告,这很好。如果没有,一切都很好。
另一方面,如果我使用了&&,但我的计算出了点问题,而&& 的一个参数是向量,我不会收到警告。这是不好的。如果出于某种原因,我真的想比较两个向量的第一个元素,我认为显式而不是隐式这样做要干净得多。
请注意,这与 R 程序员之间似乎达成的共识相反,也与 R 文档的建议相反。 (1)
因此我的问题:除了短路之外,还有什么原因可以使&& 在if 语句中优于&?
(1) 引用help(&&):
'&' 和 '&&' 表示逻辑 AND 和 '|'和'||'表明 逻辑或。较短的形式执行元素比较 与算术运算符的方式非常相似。较长的形式 从左到右求值,只检查每个元素的第一个元素 向量。仅在确定结果之前进行评估。 较长的形式适用于编程控制流和 通常在“if”子句中首选。
【问题讨论】:
-
我基本上同意你的布局。注意:
&&稍微快一些(尽管可能无关紧要)。我主要使用&&,因为它允许短路。我也希望 R 有标量数据类型。不确定“按位”比较是什么意思;我认为这不适用于这些运营商。 -
@BrodieG 关于“按位”:说实话,我从this answer 那里得到了这个表达。我想你是对的,它不适用于这里;稍后我会删除它以避免混淆。
标签: r vectorization conventions