首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

R语言笔记8:functions——词法作用域

Scoping Rules of R

作用域(scope,或译作有效范围)是名字(name)与实体(entity)的绑定(binding)保持有效的那部分计算机程序。

什么是作用域规则?

作用域规则(Scoping Rules)决定了一个函数的值如何与自变量绑定起来

在一个函数中,有两种类型的变量:

一种是函数的参数,

另一种存在于函数中的其他变量或符号,并非是函数的参数。问题在于你如何给这些符号赋值。

R用的是词法作用域(Lexical Scoping),也成静态作用域。

词法作用域又叫做静态作用域,采用词法作用域的变量叫词法变量。

词法作用域里,取变量的值时,会检查函数定义时的文本环境,捕捉函数定义时对该变量的绑定。

词法变量有一个在编译时静态确定的作用域。词法变量的作用域可以是一个函数或一段代码,该变量在这段代码区域内可见(visibility);在这段区域以外该变量不可见(或无法访问)。

相反,采用动态作用域的变量叫做动态变量。

只要程序正在执行定义了动态变量的代码段,那么在这段时间内,该变量一直存在;代码段执行结束,该变量便消失。

词法作用域的优点是能够简化运算,在统计分析时非常有效

通过下面这个函数,举个栗子:

这个函数是取x的平方然后加上y除以z的值,其中有两个明确的形式参数和,问题是从哪儿来的?

因为没有在函数中定义,所以是一个自由变量

语法作用域解决的问题就是怎样给一个类似的自由变量赋值

词法作用域的规则

词法作用域的规则,简而言之一句话:

在定义函数的环境中搜索自由变量的值

那么问题来了……

什么是环境?

环境是符号-值对(symbol-value,如x = 3.14)的集合。每一个符号都有一个与之绑定的值。

每个环境都有一个上层环境(parent environment)。对于上层环境而言,他可能有很多子环境。唯一没有上层环境的环境叫做空环境。

你可以把你的全局环境(工作空间)看做一系列“符号-值对”,其中每个对象都有一个与之关联的对象。

因此,每一个包都有一个命名空间,就是一个环境,其中有很多符号、以及与符号关联的值。

如果你把一个函数和环境联系起来,就创建了一个闭包(function losure),这些闭包是R中各种各样神器操作的关键所在。

所以,如果要在函数里遇到自由变量,怎么办?

先你需要找的是:这个函数是在那个环境中被定义的。看看是否在全局环境中被定义,如果没有,就去它的父环境里面找,以此类推,往上找直到顶层环境。(在全局环境外定义函数也是有可能的)

如果所有环境中都找不到想要的符号的话,就会报错。

作用域规则的重要性

为什么作用域规则很重要?

通常在全局环境重定义一个函数,在工作区就能够找到自由变量的值。

但是重点是,在R中,你能够在函数里面再定义其他函数

一般情况下,函数的返回值是数值、数据框、列表、等等,但也有可能是一个函数

在这种情况下,全局环境就产生了变化,作用域原则的影响就表现出来了。

举例,定义一个“构造性”函数,即这个函数在构造另一个函数:

创建一个构造函数,赋值为n;其内部用来构造另一个函数,赋值为x。这个函数的功能是,对它的参数x求n次方,然后返回结果。

所以在函数的内部,x是参数,n就是一个自由变量。

所以如果运行函数,赋值给cube,那么cube就会返回一个函数:

这时,cube就成了一个函数,相当于(实际上是没有pow的,他只是一个内部的代号),所以调用:

(2的立方是8)

Exploring a Function Closure

怎么才能查看一个函数所在的环境中都有啥?

调用函数

如上例:

查看对象的赋值,使用:

这就是怎么知道的过程。

参考资料:

视频课程 R Programming by Johns Hopkins University:https://www.coursera.org/learn/r-programming/home/welcome

讲义 Programming for Data Science :https://bookdown.org/rdpeng/rprogdatascience/R

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180322G16UX200?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券