我期待对于“和”操作,如果将LHS表达式评估为FALSE
,则不会评估RHS表达式。
但是,虽然这(1)工作正常:
'xxx' %in% names(mtcars) & all(mtcars$xxx > 0)
# [1] FALSE
这一个(2)发出警告:
'xxx' %in% names(mtcars) & sum(!is.na(mtcars$xxx)) > 0
# [1] FALSE
# Warning message:
# In is.na(mtcars$xxx) :
# is.na() applied to non-(list or vector) of type 'NULL'
显然,该误差表明评估了上述线的RHS。由于'xxx' %in% names(mtcars)
是FALSE
,为什么sum(!is.na(mtcars$xxx)) > 0
得到评估?为什么第一个没有警告呢?
您需要&&
运算符进行短路。
> FALSE & stop("hey")
Error: hey
> FALSE && stop("hey")
[1] FALSE
来自?'&'
:
&和&&表示逻辑AND和|和||表示逻辑OR。较短的形式以与算术运算符大致相同的方式执行元素比较。较长的形式从左到右评估仅检查每个向量的第一个元素。评估仅在确定结果之前进行。较长的形式适用于编程控制流程,通常在if子句中是优选的。
至于为什么第一个没有创建错误/警告......这是因为没有任何东西可以发出警告。我们可以一步一步地看看会发生什么。
> mtcars$xxx
NULL
> NULL > 0
logical(0)
> all(logical(0))
[1] TRUE
请注意,最后一部分与文档完全一致。来自?all
:
如果x中的所有值都为TRUE(包括没有值),则返回的值为TRUE