刚学习R遇到这个Scoping Rules(范围规则) 还是常令人挠头想不通的,下面整理一下自己的学习笔记:
在函数内部的变量可以分为三类: 形式参数 (formal parameters), 局部变数 (local variables) 和 自由变数 (free variables). formal parameters, local variables and free variables 形式参 数是出现在函数的参数列表中的自变量, 它们的值由实际的函式自变量 结合 (binding) 成形式参数. 局部 变数由函式内部的表达式之值结合成的. 既不是形式参数又不是局部变量的变量是自由变量. 自由变量 如果被指派值将会变成局部变量.
任何在函式内部的普通指派值 (assign) 都是局部 (local) 且暂时的, 当退出函式时都会遗失. 因此 函式中的指派之指令 X <- qr(X) 不会影响使用该函式的程序指派值情况. 如果想在一个函式里面 总 体变数 (global variable) 指派值或者永久指派, 可以采用 “强迫指派”) (superassignment) 操作 符 <<- 或者采用函式 assign(). (splus) <<- 与在 R 里面有着不同的语义.) 函式内的局部变数也是局部的, 对函式内的局部变量指派值, 当函式结束执行后局部变量值就删除, 不影响原来相同名称之总 体变量的值.
SR的重要性在于 它决定了自由变量怎么对应函数(Function)的值,也就是说对于一个变量,它的Lexical scoping rule应该是在哪个环境中进行搜索的。
而Scoping Rules在R是如何表达的呢?
## the values of free variables are searched for in the environment in which the function was defined.
##在定义函数的环境中搜索自由变量的值。
空谈理论难理解,举几个codes:
> sum(num=1:10)
[1] 55
> num
Error: object 'num' not found
> sum(num<-1:10)
[1] 55
> num
[1] 1 2 3 4 5 6 7 8 9 10
##用"<<-"
> ab<-function(x){
+ y<-x+pi
+ pi<<-3.14
+ y
+ }
> pi
[1] 3.14
> ab<-function(x){
+ y<-x+pi
+ pi<<-3.14
+ y
+ }
> ab(2)
Error in ab(2) : cannot change value of locked binding for 'pi'
在一个Function中,对一个变量的lexical scoping rule的检索次序是,先检查本Function中的environment,如果能找到该变量,则返回该变量,如果不能,则检索这个Function被创建(不是被调用)的Environment,以此类推,一直到检索Global Environment。
这个网站也有非常详细的关于SR的教学,有兴趣的也可以去了解一下:
https://bookdown.org/rdpeng/rprogdatascience/scoping-rules-of-r.html