1.6 理解闭包
函数是R语言的一级成员。换句话说,你可以给一个函数传递另一个函数。在之前的教程中,我们展示了如何创建一个被命名的函数。然而,我们也可以创建一个不带名字的函数,即闭包(也就是匿名函数)。在本教程中,我们会展示如何在标准函数中使用闭包。
准备工作
确保你已经在操作系统中安装了R语言,完成了之前的步骤。
实现步骤
执行下列步骤,在函数中创建闭包。
1.让我们回顾一下被命名的函数是如何工作的:
2.现在,让我们使用同样的步骤,通过闭包来求两个变量的和:
3.我们也可以在另一个函数中调用闭包函数:
4.与apply函数族类似,你可以使用向量化计算:
5.我们可以把函数加到一个列表中,并对给定的向量应用这个函数:
运行原理
在R语言中,你不需要给每一个函数都指定名字。相反,你可以使用闭包来整合方法与对象。因此,你可以在一个对象中创建更小、更简单的函数来完成复杂的任务。
在第1个例子中,我们展示了如何创建一个正常命名的函数。我们可以通过给函数传值来调用函数。另外,我们在第2个例子中展示了闭包是如何工作的。在这个例子中,我们不需要给函数指认名称,但是依然可以给匿名函数传值,并获取返回值。
然后,我们展示了如何把一个闭包添加到名为maxval的函数中。这个函数仅仅返回两个参数中的最大值。然而,我们也可以在另一个函数内部使用闭包。而且,我们还可以在更高阶的函数中把闭包当作参数使用,例如lapply和sapply。这里,我们把匿名函数当作函数的参数,来返回任意给定列表中第1个向量值与10的乘积。
接着,我们给出了一个函数,或者也可以把函数存放在列表中。 这样,当我们想把乘积函数应用到给定的向量上时,就可以把它当作函数lapply的参数列表来调用。
更多技能
除了在函数lapply内部使用闭包,我们也可以把闭包传递给apply函数族中的其他函数。这里,我们展示了如何把同一个闭包传递给函数sapply: