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