当LHS在R中为FALSE并在R中运行时,为什么要对RHS进行评估?

时间:2017-12-21 13:43:53

标签: r

我期待"和"如果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会被评估?为什么第一个没有警告?

1 个答案:

答案 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   (包括如果没有值)