一、環境空間的特點
環境空間是一種特殊類型的變量,它可以像其它變量一樣被分配和操作,還可以以參數的形式傳遞給函數。
R語言中環境空間具有如下3個特點:
1、對象名稱唯一性
此特點指的是在不同的環境空間中可以有同名的變量出現,但是在同一個環境空間內不允許有同名的變量出現,即使對同一個變量進行多次賦值操作,其每次賦值的內存地址也都不相同。
# 定義變量x并查看其內存地址
x <- "你好,關關。"
data.table::address(x)
# 對x重新賦值然后查看其內存地址
x <- c(22,33,44,55)
data.table::address(x)
?
2、變量賦值傳遞性
如果把當前環境空間變量賦值給一個新變量,修改原有環境空間變量的值,則新環境空間中的變量值也會跟著改變。
# 創建環境空間變量e1
e1 <- new.env()
# 將環境空間變量e1賦值給e2
e2 <- e1
# 給e1環境空間中的變量賦值
e1$x <- c(1,2,3)
# 查看e2中的變量x
e2$x
# 比較e1和e2是否相同
identical(e1, e2)
# 查看e1和e2的環境地址是否相同
data.table::address(e1)
data.table::address(e2)
?
3、結構層次性
?在R語言的環境變量中,空環境是最頂層的環境空間,其次是base包的環境空間,最后是自定義的環境空間。可以通過遞歸查找父環境空間來查看整個環境空間的層次結構。
# 刪除當前環境空間里的所有對象
rm(list = ls())
# 創建新的環境空間對象e1
e1 <- new.env()
# 編寫遞歸查找父空間的函數
parent.find <- function(e) {print(e)if (is.environment(e) & !identical(emptyenv(), e)) {parent.find(parent.env(e))}
}
# 遞歸查找環境空間e1的父空間
parent.find(e1)
?
?從以上結果可知:內部環境e1的父環境是全局環境,接著是base包環境,和通過Autoloads函數加載的6個基礎包環境(stats,graphics,grDevices,utils,datasets,methods),最頂層的是空環境。
二、環境空間種類
R語言中有5種環境:
全局環境:也叫用戶環境,指在當前用戶下R程序運行的環境空間。
內部環境:通過“new.env()”命令創建的環境空間,也可以是匿名的環境空間。
父環境:當前環境空間所處的上一層環境。
空環境:也叫頂層環境,指沒有父環境的環境空間。
包環境:指R包封裝的環境空間。
1、全局環境
# 全局環境(當前環境)
environment()
2、內部環境
e <- new.env()
e
3、父環境
# 查看環境e的父環境
parent.env(e)
4、空環境
emptyenv()
5、包環境
baseenv()
三、環境空間的使用方法
?R語言的base包有一些基礎的函數,可以用來使用環境空間。
environment:查看函數的環境空間定義;
environmentName:查看環境空間的名字;
env.profile:查看環境空間的屬性值;
new.env:創建一個新的環境空間;
is.environment:判斷一個對象是否屬于環境空間;
ls:列出當前環境空間中的所有對象;
search:查看當前環境空間中加載的R包;
exists:查看指定環境空間中的對象是否存在;
get:取出指定環境空間中的對象;
assign:給環境空間中的變量賦值;
rm:刪除環境空間中的對象。
1、環境空間的訪問
?查看函數所在的環境空間
# 查看mean函數所在的環境空間
environment(mean)
?新建環境空間
# 新建環境空間
e <- new.env(hash=T, parent = parent.frame(), size=29L)
?判斷是否是環境空間
# 判斷是否是環境空間
is.environment(e)
?
?查看環境空間的屬性
# 查看環境空間的屬性
env.profile(e)
設置環境空間的名字及查看其名字?
# 設置環境空間的名字及查看其名字
attr(e, "name") <- "Ning"
environmentName(e)
?
?2、環境空間的對象操作
清除當期環境空間中定義的所有對象,并創建新對象
# 清除當前環境空間中定義的所有對象,并創建新對象
rm(list = ls())
e1 <- new.env(hash=T, parent = parent.frame(), size = 29L)
e1
?給環境空間添加變量
# 給環境空間添加變量
e1$x <- c(2,3,5,7)
e1$y <- function(){"你好,關關。"
}
assign(x = "a", value = "你好,關關。", envir = e1)
查看當前環境空間和e1空間中的變量?
ls(e1)
?
查看環境空間中某個變量是否存在
# 查看e1環境變量中x變量是否存在
exists("x", envir=e1)
?
取出環境空間中的變量值
get("x", envir=e1)
給環境空間中的變量重新賦值
assign(x = "x", value = c(1,2,3,4,6,7), envir = e1)
get("x", envir=e1)
刪除環境空間中的變量
rm(x, envir=e1)
ls(e1)