我期待"和"如果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
会被评估?为什么第一个没有警告?
答案 0 :(得分:2)
您需要&&
运算符进行短路。
> 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 (包括如果没有值)