本文参阅《R语言实战》,学习笔记
环境包括框架和外壳。框架是符号-值(对象名称及其内容)的集合,外壳是指向封闭环境的一个指针。封闭环境也称为父环境。R允许人们在语言内部操作环境,以便达到对范围的细微控制以及函数和数据的分离。
在互动部分,当你第一次看大R的提示时,你处于全局环境。你可以通过new.env()函数创建一个新的环境并通过assign()函数在环境中创建任务。对象的值可以通过get()函数从环境中得到。例如:
x<-5
myenv=new.env()
assign("x", "Homer", env=myenv)
ls()
[1] "myenv" "x"
ls(myenv)
[1] "x"
x
[1] 5
get("x",env=myenv)
[1] "Homer"
另外使用assign()和get()函数时可以使用$例如:
myenv$x
[1] "Homer"
parent.env(myenv)
<environment: R_GlobalEnv>
parent.env()函数展示了父环境。myenv的父环境就是全局环境,全局环境的父环境是空环境。
因为函数是对象,所以它们也有环境。在探讨函数闭包(function closure,以创建时状态被打包的函数)时非常重要 例由另一个函数创建的函数:
trim <- function(p){
trimit <- function(x){
n <- length(x)
lo <- floor(n*p) + 1
hi <- n + 1 - lo
x <- sort.int(x, partial = unique(c(lo, hi)))[lo:hi]
}
trimit
}
x <- 1:10
trim10pct <- trim(.1)
y <- trim10pct(x)
y
[1] 2 3 4 5 6 7 8 9
trim20pct <- trim(.2)
y <- trim20pct(x)
y
[1] 3 4 5 6 7 8
ls(environment(trim10pct))
[1] "p" "trimit"
get("p", env=environment(trim10pct))
[1] 0.1
ls(environment(trim20pct))
[1] "p" "trimit"
get("p", env=environment(trim20pct))
[1] 0.2
trimit(p)函数返回一个函数,这样做是因为p值在trimit() 函数的环境中并被保存在函数中。在R中函数一旦被创建里面的对象就存在环境中。这一事实可以解释下面的做法:
makeFunction <- function(k){
f <- function(x){
print(x + k)
}
}
g <- makeFunction(10)
g (4)
[1] 14
k <- 2
g (5)
[1] 15
ls(environment(g))
[1] "f" "k"
environment(g)$k
[1] 10
environment(g)$f
function(x){
print(x + k)
}
<environment: 0x00000000122923f8>
无论在全局环境中的k值是什么,g()函数使用k=10,因为当此函数被创建时k被赋值为10。