學習筆記,僅供參考,有錯必糾
環境空間是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 ...