在Advanced R中使用NULL的延迟评估示例

时间:2017-06-08 15:36:26

标签: r lazy-evaluation

在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()吗?

1 个答案:

答案 0 :(得分:0)

这就是&&运算符的工作方式。它被称为short-circuiting,与懒惰评估分开。

延迟评估是指评估函数参数的方式。特别是,只有当(如果)它们实际用在函数中时才会计算参数。例如,请考虑以下函数

f <- function(a, b) NULL

不执行任何操作并返回NULL。参数ab永远不会被评估,因为它们未被使用。它们不会出现在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
相关问题