[R] Lexical & Dynamic Scoping / Execution & Calling environments / Closures
Lexical Scoping :有Java繼承中呼叫子類時先生成父類的概念,呼叫函數後,系統會轉至其定義處,將其 environment 中所具有的東西(有些可能定義在外層)形成 Closure [閉包]
Dynamic Scoping :呼叫處起算,逐漸往上層找
有閉包的lexical scoping是依據定義處逐層向外檢查Closure中變量是否存在,而dynamic scoping則是根據函數調用鏈逐層向外檢查變量是否存在
Execution environments : 每當function被呼叫,遵守 fresh start principle,會新生成封閉式環境,用以host execution,當function執行完成後,此環境將被清除。

Calling environments : 呼叫function時當下的封閉式環境

f()時的calling 環境中,所具有的參數為 (global) x =0, y = 10
g()時的calling 環境中,所具有的參數為 (f) x =1 , (global) y = 10
h()時的calling 環境中,所具有的參數為 (g) x =2 , (global) y = 10
將x設為3後,計算x+y=13,執行完成時f()、g()、h()各自所產生的封閉環境逐一瓦解,global 中的參樹依然沒有改變 x =0, y = 10
parent.frame:The parent.frame refers to the environment where the function was called from, not where it was defined.
Closures enclose the environment of the parent function and can access all its variables.
此時功能性(多層次)function設計可將參數劃分為兩種層級
- parent level : 調控運作
- child level: 實際運作
範例中以一個 parent function (power()) 生成兩個 child functions (square() 和 cube())
power <- function(exponent) {
function(x) {
x ^ exponent
}
}
square <- power(2)
cube <- power(3)
square(2)
## [1] 4
cube(2)
## [1] 8
square被設定為次方,cube則被設定為立方,但檢視兩者時會發現並無明顯不同
square
## function(x) {
## x ^ exponent
## }
## <environment: 0x3719630> cube
## function(x) {
## x ^ exponent
## }
## <environment: 0x3870b58>
其實兩者的差異,是在於所擁有的environment包並不一致
square : <environment: 0x3719630>
cube : <environment: 0x3870b58>
可用as.list(environment( )) 或是 pryr::unenclose() 查看environment包中的設定數值
as.list(environment(square))
## $exponent
## [1] 2
as.list(environment(cube))
## $exponent
## [1] 3
library(pryr)
unenclose(square)
## function (x)
## {
## x^2
## }
unenclose(cube)
## function (x)
## {
## x^3
## }
R中幾乎所有function都是Closure,Closure可獨立存取呼叫時所設立的資訊,而使其不會隨呼叫完成時一起消失 [有Java生成實體的感覺]
更多可參考 Advanced R by Hadley Wickham
[R] Lexical & Dynamic Scoping / Execution & Calling environments / Closures的更多相关文章
- R2—《R in Nutshell》 读书笔记(连载)
R in Nutshell 前言 例子(nutshell包) 本书中的例子包括在nutshell的R包中,使用数据,需加载nutshell包 install.packages("nutshe ...
- R Programming week2 Functions and Scoping Rules
A Diversion on Binding Values to Symbol When R tries to bind a value to a symbol,it searches through ...
- Coursera系列-R Programming第三周-词法作用域
完成R Programming第三周 这周作业有点绕,更多地是通过一个缓存逆矩阵的案例,向我们示范[词法作用域 Lexical Scopping]的功效.但是作业里给出的函数有点绕口,花费了我们蛮多心 ...
- Static vs Dynamic Scope
转自:http://hoolihan.net/blog-tim/2009/02/17/static-vs-dynamic-scope/ // start pseudo-code var y = &qu ...
- [转]Dynamic SQL & Stored Procedure Usage in T-SQL
转自:http://www.sqlusa.com/bestpractices/training/scripts/dynamicsql/ Dynamic SQL & Stored Procedu ...
- 《R语言入门与实践》第一章:R基础
前言 本章介绍了 R 语言的基础知识 界面: 使用命令 “ R “进行命令行的实时编译 对象 定义: 用于储存数据的,设定一个名称 格式: a <- 1:6 命名规则: 规则1:不能以数字开头规 ...
- 泡泡一分钟:Efficient Trajectory Planning for High Speed Flight in Unknown Environments
张宁 Efficient Trajectory Planning for High Speed Flight in Unknown Environments 高效飞行在未知环境中的有效轨迹规划链接: ...
- bash5.0参考手册
Bash Reference Manual a.summary-letter { text-decoration: none } blockquote.indentedblock { margin-r ...
- malware analysis、Sandbox Principles、Design && Implementation
catalog . 引言 . sandbox introduction . Sandboxie . seccomp(short for secure computing mode): API级沙箱 . ...
随机推荐
- JS之代理模式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 团队作业4——beta冲刺
beta冲刺准备 冲刺准备 5天冲刺博客 Beta冲刺一 Beta冲刺二 Beta冲刺三 Beta冲刺四 Beta冲刺五 用户使用报告 用户使用用报告 冲刺总结 冲刺总结随笔 项目码云地址 码云地址
- css颜色,字体大小的设置
设置字体的颜色通过下面的代码: color : #f00; color是颜色的意思,color用来设置一个标签的前景色,表现出来也就是元素文本的颜色. 它的值,一般都是使用#加16进制的颜色值来表示. ...
- js中获取时间new Date()详细介绍
var myDate = new Date();myDate.getYear(); //获取当前年份(2位)myDate.getFullYear(); //获取完整的年份(4位,1970-????)m ...
- malloc/free与new/delete的区别与联系
相同点:(1)都是申请内存,释放内存,free和delete可以释放NULL指针:(2)都必须配对使用,这里的配对使用,可不能理解为一个new/malloc就对应一个delete/free,而是指在作 ...
- Linux----Github环境搭建
前面介绍了在Windows环境上安转GitHub环境,原本以为打包成jar,发布到Linux不需要再安转Git,但是因为我们使用了Config-Server配置中心,远程配置来启动,所以需要在Linu ...
- commons-lang常用方法
跟java.lang这个包的作用类似,Commons Lang这一组API也是提供一些基础的.通用的操作和处理,如自动生成toString()的结果.自动实现hashCode()和equals()方法 ...
- Lvs Dr 模式配置
1.Dr 安装 ipvsadm # yum -y install ipvsadm # lsmod | grep ip_vs #检查ipvs模块是否加载进系统.把ipvs模块加载进系统,需要我们执 ...
- matlab程序设计
一.M文件 1.脚本文件 (1)英文字母开头命名 (2)所产生的所有变量驻留在base workspace,只要不用clear,就只有关闭MATLAB,才会被删除 2.函数文件 (1)function ...
- (原创)Verilog三段式状态机
下面以上图一个简单的FSM说明三段式Verilog状态机范式: `timescale 1ns / 1ps module FSM( clk,rst_n, in1,in2, out1,out2, CS,N ...