R语言中的环境

本文参阅《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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值