Environment
環境的工作就是提供一組變數(或稱Symbol)跟value的參照,當使用者對Symbol進行取值,R會先搜尋使用者是否定義過,如果沒有會從工作環境找。
而環境之間有優先次序的分別,可以打search()
看搜尋列表:
> search()
[1] ".GlobalEnv" "tools:rstudio" "package:stats" "package:graphics" "package:grDevices"
[6] "package:utils" "package:datasets" "package:methods" "Autoloads" "package:base"
較低層的叫child environment,反之則叫做parent environment (btw 最高層的叫做empty environment)。
如果一個Symbol在某個先搜尋的環境中已被定義,就不會向後搜尋後面的環境了,可以將Symbol搜尋的順序粗分為這些部分跟search()
的結果對照:
global environment
".GlobalEnv",搜尋總是從這裡開始。
search list
從"tools:rstudio"到"Autoloads"依序搜尋,如果用
library()
引入package,那package會被添加在這個列表的最前面,成為列表中最優先的搜尋環境。base package
總是最後一個被搜尋。
Scope (作用域)
主要在說明函式內的變數如何定義它的作用域。
Function Closure
> f <- function(){
+ #here is so called function closure
+ }
Local/Free Variables
Local variables
在function closure內部被定義的變數
Free variables
沒有在function內部被定義,但有被使用到的變數。
Static/Dynamic Scoping
Static Scoping
從函式被定義的地尋找變數定義,R, python, perl, C++, C, C#...都是。 R當中函式的返回值是函式時,回傳函式的定義處在原始函式內,因此free variable的值要從原始函式的function closure內開始向外找起,這個功能用於"以函式設定函式。
#查一下現在在哪個環境裡吧
> environment()
<environment: R_GlobalEnv>
#x與函式f都在GlobalEnv中被定義,f裡面會用到x
> x <- "in GlobalEnv"
> f <- function(){
+ print(x)
+ }
#然後函式g裡面也定義一個叫做x的local variable,呼叫f()執行
> g <- function(){
+ x <- "local variable"
+ f()
+ }
#可以看到不管是透過g()或直接執行f()...
#由於R是採用static scoping,f函式裡面的x都從GlobalEnv裡面找
> f()
[1] "in GlobalEnv"
> g()
[1] "in GlobalEnv"
Dynamic scoping
從函式被呼叫的地尋找變數定義,S語言(R的前身)用這個。