R開發 part7 環境空間

2021-10-09 01:29:10 字數 4315 閱讀 1765

學習筆記,僅供參考,有錯必糾

環境空間是r語言中關於計算機方面的底層設計,主要用於r語言的環境載入器。通過環境空間,封裝了載入器的執行過程,讓使用者在不知道底層細節的情況下,可以任意載入使用到的第三方r語言程式包。

在r語言中,不管是變數、物件或者函式,都存在於r的環境空間中,r程式在執行時變數、函式都有自己的執行時空間。r語言的環境(environment)是由核心定義的乙個資料結構,由一系列、有層次關係的框架(frame)組成,每個環境對應乙個框架,用來區別不同的執行時空間(scope)。

環境空間有一些特徵,比如每個環境空間要有唯一的名字;環境空間是引用型別,非賦值型別;環境空間都有父環境空間,空環境空間是最頂層的環境空間,沒有父空間;子環境空間會繼承父環境空間的變數等。

建立乙個空間

通過new.env()函式可以建立乙個新的環境。

語法:

new.env(hash = true, parent = parent.frame(), size = 29l)
hash預設值是true,使用hash table的結構,parent指定要建立環境的父環境,size是指初始化環境空間的大小。

建立乙個新環境:

r>e1 <- new.env()

r>e1

r>class(e1)

[1] "environment"

r>otype(e1)

[1] "base"

e1環境中定義乙個變數:

r>#定義變數a

r>e1$a <- 10

r>#輸出變數a

r>e1$a

[1] 10

r>#列出當前環境中的變數

r>ls()

[1] "a" "b" "e1" "i" "myl" "track_a" "x" "y"

[9] "z"

r>#列出e1環境中的變數

r>ls(e1)

[1] "a"

環境空間的層次結構

r語言的環境空間是一種有層次關係的結構,每個環境都有上一層環境,直到最頂層的空環境。r語言中有5種環境的定義,即全域性環境、內部環境、父環境、空環境和包環境。

r># 當前環境

r>environment()

r># 內部環境

r>e1 <- new.env()

r>e1

r># 父環境

r>parent.env(e1)

r># 空環境

r>emptyenv()

r># 包環境

r>baseenv()

用search函式檢視當前環境中載入的r包:

r># 檢視環境空間

r>search()

[1] ".globalenv" "package:pryr" "tools:rstudio" "package:stats"

[5] "package:graphics" "package:grdevices" "package:utils" "package:datasets"

[9] "package:methods" "autoloads" "package:base"

r>.globalenv

檢視父環境空間:

r>#檢視e1環境的父環境空間

r>parent.env(e1)

r>#檢視當前環境的父環境空間

r>parent.env(environment())

attr(,"name")

[1] "package:pryr"

attr(,"path")

[1] "f:/software/r-3.6.2/library/pryr"

r>#檢視base包環境的父環境空間

r>parent.env(baseenv())

r>#檢視空環境的父環境空間

r>parent.env(emptyenv())

error in parent.env(emptyenv()) : the empty environment has no parent

r>#因沒有父環境,所以出現錯誤

既然環境空間是有層次關係的,那麼我們列印這個層次結構,從自定義的e1環境到最上層的空環境:

parent.call <- function(e) 

}parent.call(e1)

#輸出attr(,"name")

[1] "package:pryr"

attr(,"path")

[1] "f:/software/r-3.6.2/library/pryr"

attr(,"name")

[1] "tools:rstudio"

attr(,"name")

[1] "package:stats"

attr(,"path")

[1] "f:/software/r-3.6.2/library/stats"

attr(,"name")

[1] "package:graphics"

attr(,"path")

[1] "f:/software/r-3.6.2/library/graphics"

attr(,"name")

[1] "package:grdevices"

attr(,"path")

[1] "f:/software/r-3.6.2/library/grdevices"

attr(,"name")

[1] "package:utils"

attr(,"path")

[1] "f:/software/r-3.6.2/library/utils"

attr(,"name")

[1] "package:datasets"

attr(,"path")

[1] "f:/software/r-3.6.2/library/datasets"

attr(,"name")

[1] "package:methods"

attr(,"path")

[1] "f:/software/r-3.6.2/library/methods"

attr(,"name")

[1] "autoloads"

通過觀察環境空間層次,我們還可以發現r包的載入順序。

最先載入的是base包,然後通過base::autoloads()函式分別載入6個基礎包,上層的pryr包則是我們手動載入的,最後以r_globalenv環境作為當前執行環境空間,內部環境空間是r_globalenv環境的下層環境空間。

環境空間的特徵

在不同的環境空間中,定義變數x:

x <- 10

e1 <- new.env()

e1$x <- 20

x # 10

e1$x # 20

把e1環境空間變數賦值給另乙個變數f,再修改其環境內部變數:

#把e1賦值給f

f <- e1

#修改e1中a變數的值

e1$a <- 100

f$a #100

#比較f環境和e1環境

identical(f, e1) #true

#檢視e1和f的環境位址

f #e1 #

空環境是最頂層的環境空間,然後是base包的環境空間,我們可以嘗試建立乙個靠近頂層的環境空間,讓父環境空間是base包的環境空間:

parent.call <- function(e) 

}#建立e2環境,以base為父環境

e2 <- new.env(parent = baseenv())

#檢視e2環境的父環境列表

parent.call(e2)

#輸出

x <- 1:5

e1 <- new.env()

e1$x <- 10

e1$fun <- function(y)

e1$fun(20) #"e1::fun"

x #20

e1$x #10

我們可以使用<<-修改父環境空間的變數值,但是用<-卻不能進行這樣的操作。

golang win7環境搭建

ide設定goroot 安裝目錄 發現ide 不能生成執行檔案,雖然日誌列印正常 goroot d go sdk gopath e hello golang d go sdk bin go.exe build o e hello golang bin hello.exe main d install...

Linux Centos7環境MariaDB安裝

簡介 mariadb 資料庫管理系統是 mysql 的乙個分支,主要由開源社群在維護,採用 gpl 授權許可 mariadb 的目的是完全相容 mysql,包括 api 和命令列,使之能輕鬆成為 mysql 的代替品 方法 一.yum install mariadb server mariadbsy...

Appium for win7 環境搭建

一 安裝node.js 2 獲取到安裝檔案後,直接雙擊安裝檔案,根據程式的提示,完成nodejs的安裝。3 安裝完成後,執行cmd,輸入node v,如果安裝成功,會輸出如下版本資訊 二 配置android sdk環境 1 sdk環境配置 2 確保安裝了 level 17 或以上的版本 api 3 ...