如果有多个布尔表达式作为which
函数的参数,它们是否会被懒惰地评估?
例如:
which(test1 & test2)
如果test1
返回false,则不会评估test2
,因为无论如何复合表达式都将为false。
答案 0 :(得分:3)
使用if
可以提高效率。记录下来以这种方式工作,我认为这不是由于懒惰的评估。即使你“强制() - ed”那个表达式,它仍然只会评估一系列& s,直到它有一个FALSE。请参阅此帮助页面:
?Logic
@XuWang可能因为强调“&”之间的区别而值得赞扬和“&&”。 “&”运算符处理向量并返回向量。 “&&”运算符作用于标量(实际上是长度== 1的向量)并返回长度== 1的向量。当向量或长度> 1作为参数的任一侧时,它将仅处理第一个值中的信息每个并发出警告。它只是“&&”执行被称为“懒惰”评估的版本。你可以看到那个“&”运营商并没有采用simepl测试的“懒惰方式”:
fn1 <- function(x) print(x)
fn2 <- function(x) print(x)
x1 <- sample(c(TRUE, FALSE), 10, replace=TRUE)
fn1(x1) & fn2(x1) # the first two indicate evaluation of both sides regardless of first value
# [1] FALSE FALSE TRUE FALSE TRUE TRUE FALSE FALSE FALSE FALSE
# [1] FALSE FALSE TRUE FALSE TRUE TRUE FALSE FALSE FALSE FALSE
# [1] FALSE FALSE TRUE FALSE TRUE TRUE FALSE FALSE FALSE FALSE