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

问题描述 投票:1回答:1

我期待对于“和”操作,如果将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得到评估?为什么第一个没有警告呢?

r
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.