R开发(part8)--应用R语言中的函数环境空间
學習筆記,僅供參考,有錯必糾
文章目錄
- R開發
- 應用R語言中的函數環境空間
- R語言的函數環境空間
- 封閉環境
- 綁定環境
- 運行環境
- 調用環境
- 函數環境空間圖示
R開發
應用R語言中的函數環境空間
R語言的函數環境空間
在R語言中,變量、對象、函數都存在于環境空間中,而函數又可以有自己的環境空間,我們可以在函數內再定義變量、對象和函數,循環往復就形成了我們現在用的R語言環境系統。
一般情況下,我們可以通過new.env去創建一個環境空間,但更多的時候,我們使用的是函數環境空間。函數環境空間,包括以下四方面的內容:
-
封閉環境,每個函數都有且只有一個封閉環境空間,指向函數定義的環境空間。
-
綁定環境,給函數指定一個名字,綁定到函數變量,如fun1<-function() {1}。
-
運行環境,當函數運行時,在內存中動態產生的環境空間,運行結束后,會自動銷毀。
-
調用環境,是指在哪個環境中進行的方法調用,如fun1<-function() {fun2()},函數fun2在函數fun1中被調用。
封閉環境
封閉環境是對函數空間的一個靜態定義,在函數定義時指向所在的環境空間。我們在當前的環境空間定義一個函數f1,并通過environment函數來查看封閉環境:
y <- 1 f1 <- function(x) {x + y} environment(f1) #<environment: R_GlobalEnv>綁定環境
綁定環境就是把函數的定義和調用通過函數變量連起來。
我們新建一個環境空間e,在e的環境空間中定義一個函數g,就相當于把一個函數綁定到g變量,通過找到e環境空間中的g變量,就可以調用這個函數:
e <- new.env() e$g <- function() {1} #查看函數g的定義 e$g #function() {1} #調用函數g e$g() #1在環境空間e中再定義一個嵌套函數:
e <- new.env() e$f <- function() {function() {1}} e$f # function() {function() {1}} e$f() # function() {1} e$f()() #1查看函數g和f的封閉環境:
environment(e$g) #<environment: R_GlobalEnv> environment(e$f) #<environment: R_GlobalEnv>運行環境
運行環境是函數被調用時產生的內存環境。運行環境是臨時的,當函數運行完成后,運行環境會被自動銷毀。在運行環境中定義的變量、對象和函數,也是動態創建的,隨著內存釋放而銷毀。
定義一個函數g,在函數g中,有臨時變量a和參數x:
g <- function(x) {message("Are you OK?")print(environment())a <- 1a <- a + xreturn(a) }g(10) #輸出start Are you OK? <environment: 0x00000000153fb488> [1] 11 #輸出endg(10) #輸出start Are you OK? <environment: 0x00000000153ae1a8> [1] 11 #輸出end可以看到,我們兩次運行得到的環境地址是不同的,明函數的運行時環境,是內存臨時分配的。
調用環境
調用環境是指函數是在哪個環境中被調用的。匿名函數通常是在定義的封閉環境中被調用。
h <- function() {x <- 20x <<- 5function() {x} }x <- 10 r1 <- h() r1() #20 x #5函數環境空間圖示
代碼:
x<-5 # 在當前環境定義變量xfun1<-function() { # 在當前環境定義fun1print("fun1") # 打印fun1環境空間print(environment())x <- 1 # 在fun1函數環境中,定義變量xfunction() {print("funX") # 打印匿名環境空間print(environment())x+15 # 從一級父環境空間中,找到變量x} }fun2 <- function() { # 在當前環境定義fun2print("fun2") # 打印fun2環境空間print(environment())x<-2 # 在fun2函數環境中,定義變量xfun1() #調用函數fun1 }f2 <- fun2() # 在當前環境空間中,調用函數fun2,綁定到f2 fx <- f2() # 在當前環境空間中,調用匿名函數,并綁定到fx fx總結
以上是生活随笔為你收集整理的R开发(part8)--应用R语言中的函数环境空间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抖音实名认证后能干嘛(抖音直播电脑版)
- 下一篇: R开发(part10)--基于S3的面向