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的前身)用這個。


Reference

Environments_Advanced R

Scope (computer _science)_wikipedia

results matching ""

    No results matching ""