在Hadley Wickham的 Advanced R 中,我在理解其中一个懒惰的评估示例时遇到了一些麻烦。
从书中复制了关于功能的章节:
懒惰在if语句中很有用 - 只有当第一个为真时,才会对下面的第二个语句进行>评估。如果不是,则该语句将返回>错误,因为NULL> 0是长度为0的逻辑向量,而不是有效输入>到if。
x <- NULL
if (!is.null(x) && x > 0) {
}
据我理解的例子,如果R没有使用延迟评估,则会同时评估!is.null()
和> 0
函数,抛出错误,因为NULL不是“&gt;的允许参数。 “功能。它是否正确?因此,当我们期望变量可能为NULL时,通常建议在R语句中包含!is.null()
吗?
答案 0 :(得分:0)
这就是&&
运算符的工作方式。它被称为short-circuiting,与懒惰评估分开。
延迟评估是指评估函数参数的方式。特别是,只有当(如果)它们实际用在函数中时才会计算参数。例如,请考虑以下函数
f <- function(a, b) NULL
不执行任何操作并返回NULL
。参数a
和b
永远不会被评估,因为它们未被使用。它们不会出现在f
的正文中,因此您可以使用您想要的任何表达式(只要它在语法上正确)作为参数调用f
,因为不会计算表达式。 E.g。
> f(1, 2)
NULL
> f(43$foo, unboundvariableblablabla)
NULL
在没有延迟评估的情况下,首先评估参数然后传递给函数,因此上面的调用将失败,因为如果您尝试评估43$foo
,您将收到错误
> 43$foo
Error in 43$foo : $ operator is invalid for atomic vectors