R笔记(2):Envorinment
#####关于环境的一些基本知识
1.什么是环境
环境(environment)是R编程中与函数和变量作用域(scope)相联系的一个基本概念,是表示更强的作用域的一种数据结构。所有的变量都储存在环境当中,环境本身也是一种变量:可以指派,可以操作,也可以作为参数传递给函数。
通常,无需明确地处理环境。在指派一个变量的时候,它就自动地进入了全局环境(global environment);在调用一个函数的时候,环境自动存贮了函数的相关变量(函数加上它的环境叫闭包closure)。但理解环境的作用对于编写高效的R函数有很大的帮助。
环境和列表(list)的关系很密切,大多数的列表语法可作用于环境,可以使用列表的方法操作环境,环境和列表也可以相互转化。但环境和列表也有几个重要的区别:
(1)当修改一个环境的时候,它的副本也会跟着变;而列表不会。
# 创建一个新环境
a <- new.env()
a$f <- 10
# 创建a的副本
b <- a
b$f
## [1] 10
# 修改环境a
a$f <- 5
b$f
## [1] 5
(2)环境是嵌套的,有继承关系。就是说一个环境是有父环境(parent environment)的。如果一个对象在当前环境中找不多,R会在它的父代中寻找(依次下去),链条顶端是一个空环境(empty environment)。 (但要注意的是,给定一个环境没法检索它的子代)
(3)环境中每个对象都有名字,而且是唯一的。
2.环境的创建、操作和检查
(1)创建:使用new.nev()创建一个环境
(2)变量指派:可以使用列表的语法把变量指派到环境中,也可以对assign函数指定一个环境参数的方法来指定变量的存储位置。
d <- new.env()
d["var1"] <- c(1, 2, 3, 4)
d$var2 <- mean(c(1:10))
assign("var3", Sys.Date(), envir = d)
(3)操作: ls(),ls.str()查看环境的内容 parent.env():检查父代环境 去掉环境中的变量使用rm()(此时不能直接象列表那样设置变量为NULL) exists()检查变量是否在环境中
ls( )
## [1] "a" "b" "d"
# 在顶层提示符没有参数的ls()显示的是此时用户工作空间所有的数据集和函数
head(ls(envir = baseenv())) #显示R的基础环境
## [1] "-" "-.Date" "-.POSIXt" "!" "!.hexmode" "!.octmode"
ls(d)
## [1] "var1" "var2" "var3"
parent.env(d)
## <environment: R_GlobalEnv>
rm("var1", envir = d)
ls(d)
## [1] "var2" "var3"
ls.str(d)
## var2 : num 5.5
## var3 : Date[1:1], format: "2013-12-03"
exists("var1", d)
## [1] FALSE
(4)检查环境中的变量: 可以使用列表的方法,也可以使用get()
d['var3']
[1] "2013-12-04"
d$var1
NULL
get('var3',d)
[1] "2013-12-04"
get('var1')
Error in get("var1") : object 'var1' not found
get()和exists()这两个函数也可以用来寻找父代环境中的变量
e <- new.env(parent = d)
exists("var3", e)
## [1] TRUE
exists("var3", e, inherits = FALSE)
## [1] FALSE
(5)环境和列表的转换:as.list,s.environment,list2env
参考:
[1]R语言编程艺术,第7章
[2]Learning R 第6章
[3]http://adv-r.had.co.nz/Environments.html
1.什么是环境
环境(environment)是R编程中与函数和变量作用域(scope)相联系的一个基本概念,是表示更强的作用域的一种数据结构。所有的变量都储存在环境当中,环境本身也是一种变量:可以指派,可以操作,也可以作为参数传递给函数。
通常,无需明确地处理环境。在指派一个变量的时候,它就自动地进入了全局环境(global environment);在调用一个函数的时候,环境自动存贮了函数的相关变量(函数加上它的环境叫闭包closure)。但理解环境的作用对于编写高效的R函数有很大的帮助。
环境和列表(list)的关系很密切,大多数的列表语法可作用于环境,可以使用列表的方法操作环境,环境和列表也可以相互转化。但环境和列表也有几个重要的区别:
(1)当修改一个环境的时候,它的副本也会跟着变;而列表不会。
# 创建一个新环境
a <- new.env()
a$f <- 10
# 创建a的副本
b <- a
b$f
## [1] 10
# 修改环境a
a$f <- 5
b$f
## [1] 5
(2)环境是嵌套的,有继承关系。就是说一个环境是有父环境(parent environment)的。如果一个对象在当前环境中找不多,R会在它的父代中寻找(依次下去),链条顶端是一个空环境(empty environment)。 (但要注意的是,给定一个环境没法检索它的子代)
(3)环境中每个对象都有名字,而且是唯一的。
2.环境的创建、操作和检查
(1)创建:使用new.nev()创建一个环境
(2)变量指派:可以使用列表的语法把变量指派到环境中,也可以对assign函数指定一个环境参数的方法来指定变量的存储位置。
d <- new.env()
d["var1"] <- c(1, 2, 3, 4)
d$var2 <- mean(c(1:10))
assign("var3", Sys.Date(), envir = d)
(3)操作: ls(),ls.str()查看环境的内容 parent.env():检查父代环境 去掉环境中的变量使用rm()(此时不能直接象列表那样设置变量为NULL) exists()检查变量是否在环境中
ls( )
## [1] "a" "b" "d"
# 在顶层提示符没有参数的ls()显示的是此时用户工作空间所有的数据集和函数
head(ls(envir = baseenv())) #显示R的基础环境
## [1] "-" "-.Date" "-.POSIXt" "!" "!.hexmode" "!.octmode"
ls(d)
## [1] "var1" "var2" "var3"
parent.env(d)
## <environment: R_GlobalEnv>
rm("var1", envir = d)
ls(d)
## [1] "var2" "var3"
ls.str(d)
## var2 : num 5.5
## var3 : Date[1:1], format: "2013-12-03"
exists("var1", d)
## [1] FALSE
(4)检查环境中的变量: 可以使用列表的方法,也可以使用get()
d['var3']
[1] "2013-12-04"
d$var1
NULL
get('var3',d)
[1] "2013-12-04"
get('var1')
Error in get("var1") : object 'var1' not found
get()和exists()这两个函数也可以用来寻找父代环境中的变量
e <- new.env(parent = d)
exists("var3", e)
## [1] TRUE
exists("var3", e, inherits = FALSE)
## [1] FALSE
(5)环境和列表的转换:as.list,s.environment,list2env
参考:
[1]R语言编程艺术,第7章
[2]Learning R 第6章
[3]http://adv-r.had.co.nz/Environments.html
> 我来回应