前言
这一章在对象的基础之上,讲解了对象所处的环境,进一步讲了环境对对象的作用,以及如何使用环境.
结构如下:
- 环境的定义和操作
- 环境的规则
- 制作闭包
环境
R 环境的定义
在 R 中,每一个数据对象都储存在一个环境中,每一个环境都与一个父环境相连,这样的父子环境构成一个分层的树形结构.
特点:
与计算机文件系统相似,但是不支持自上而下的搜索.
R 环境的操作
environment() 查看活动环境
活动环境:即 user workspace(用户工作区),命令行中运行的命令在 R_GlobalEnv(全局环境)中工作.
功能:查看活动环境
assign() 取值
格式:
assign("new", "Hello World!", envir = globalenv() )
assign 有三个参数:
- 对象的名称:字符串格式的名称
- 对象的取值
- 对象所在环境的名称
功能:在特定的环境中,创建一个含有特定的去值的数据对象.
parent.env() 查看父环境
功能:查看父环境
格式: parent.env(globalenv())
其中的参数为环境的调用函数.
在 R 中,有三种环境可以调用,分别是:
- R_GlobalEnv 全局环境: globalenv()
- base 基环境: baseenv()
- R_EmptyEnv 空环境:emptyenv()
R 环境的规则
作用域规则
在命令行工作的前提下,活动环境为全局环境
规则如下:
- 首先在全局环境中搜索对象
- 如果没有搜索到对象,那么进行该环境的父环境继续搜索对象.
函数工作环境
运行函数时,函数本身创建一个临时的工作环境.
原环境:函数工作环境(调用环境)的父环境
注意:
- 在命令行创建的函数的原环境为 R_GlobalEnv
- 对于其他函数,函数第一次运行所在的环境为该函数运行的父环境
Closure 闭包
定义:
由于函数中存在位置处于 R_GlobalEnv 中的数据对象.而 R_GlobalEnv 时常发生变化,因此为了安全,将 R_GlobalEnv 的参数即函数打包在一起,使得函数调用时,能够在当前环境直接调用.称为「闭包」.
格式:
setup <- function(deck) {
DECK <- deck
DEAL <-function(){
card <- deck[1, ]
assign("deck", deck[-1, ], envir = parent.env(enviroment()))
card
}