本节书摘来自华章出版社《数据科学:R语言实现》一 书中的第1章,第1.5节,作者:R for Data Science Cookbook 丘祐玮(David Chiu),更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1.5 使用词法域
词法域又称静态绑定,确定了一个取值如何绑定到一个函数的*变量。它是源于范式函数式编程语言的重要特征,也是R语言区别于S语言的地方。在本教程中,我们会展示词法域在R语言中是如何工作的。
准备工作
确保你已经在操作系统中安装了R语言,完成了之前的步骤。
实现步骤
执行下列步骤,理解词法域规则是如何工作的。
1.我们创建一个变量x,然后创建函数tmpfunc,返回结果x+3:
运行原理
有两种不同类型的变量绑定方法:一种是词法绑定,另一种是动态绑定。词法绑定也叫作静态绑定,它的每一个绑定域都会管理变量名和词法环境中的取值。 也就是说,如果一个变量被词法约束了,它会搜索最近的词法环境中的绑定关系。与此不同的是,动态绑定会以全局状态保存所有的变量和取值。 也就是说,如果一个变量被动态约束了,它会与最新创建的变量绑定。
为了说明词法绑定是如何工作的,我们首先创建了变量x,并在全局环境中指派5给x。然后,我们可以创建名为tmpfunc的函数。这个函数输出x+3作为返回值。尽管我们并没有在函数tmpfunc中把任何取值指派给x,x依然在全局环境中找出了取值5。
然后,我们创建了另一个名为parentfunc的函数。在这个函数里,我们把x指派成3,并创建嵌套函数(定义在函数中的函数)childfunc。在parentfunc函数体底部,我们调用childfunc作为函数输出。我们发现此时函数使用了定义在parentfunc中的x,而不是定义在parentfunc之外的x。这是因为R会在全局环境中搜索匹配的符号名,并在搜索列表中搜索程序包的命名空间。
接下来,让我们看一下,如果我们在全局状态下创建名为x的字符串,并在函数中对局部变量x指派为5,会返回什么结果。当我们调用localassign函数时,发现该函数返回了5,而不是字符串取值。另外,如果我们打印出x的取值,我们依然可以看到字符串结果。当局部变量和全局变量拥有同样的名字时,函数的指派并不会改变全局状态下的x值。如果你想在全局状态下修改x的值,你可以使用记号<<-。
更多技能
为了查看R的搜索列表(或者路径),你可以键入search()来列出相关结果: