懒惰评价`which`函数参数?

时间:2011-11-27 18:02:20

标签: r

如果有多个布尔表达式作为which函数的参数,它们是否会被懒惰地评估?

例如:

which(test1 & test2)

如果test1返回false,则不会评估test2,因为无论如何复合表达式都将为false。

1 个答案:

答案 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