![大数据分析与应用实战:统计机器学习之数据导向编程](https://wfqqreader-1252317822.image.myqcloud.com/cover/943/44509943/b_44509943.jpg)
1.2 环境与辅助说明
编写程序时变量名称的正式称谓是符号(symbols),当我们指定一个对象(参见1.6节编程范式与面向对象概念)给某个变量名称时,实际上就是指定该对象到当前环境(environment)中的一个符号。以R语言为例:
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P25_20049.jpg?sign=1739426102-axAaopRIG8zq62qEKpnvxArYKKkTwy8Q-0-61a733b654592c3b56e67a3b2fe610ac)
因此,反过来说,环境的定义是一组定义在相同情景(context)的符号集合。R语言中的一切都是对象(object),前述的符号、后面要谈的函数与R表达式、此处的环境等都是对象。理解对象最简单的方式就是把它想象成运用计算机表达出来的事物,而所有的R语言程序代码都是在处理对象,每个R指令的评价与求值(evaluation)都与某个环境有关(Adler,2012)。
一般而言,R语言有四个特殊环境 :
· globalenv()函数返回全局环境,亦称为交互式工作空间(interactive workspace),它通常是用户进行数据处理与建模等工作的当前环境。图1.5显示此环境包含任何用户定义的对象,例如向量、矩阵、数组、数据集、列表、时间序列等数据对象(参见1.3节R语言数据对象)或函数对象。加载的各个套件与附加上的数据集会依序地串在全局环境之下,成为全局环境的父环境,这一长串的父子环境又称为搜索路径(search path),如图1.6所示。图中下方为父,上方为子,全局环境的父环境指的是先前使用library()或require()载入的一个个套件(library()与require()的区别请看https://yihui.name/en/2014/07/library-vs-require/)。1.1.2节提过的search()函数,列出了全局环境的所有父环境,因此可以检查我们到底已经加载了哪些套件到内存中。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P26_1251.jpg?sign=1739426102-dENyg87MvNwLr7WIsoQaE4sVqtXok9xn-0-7efe220a49793903e00d5defc5d83dba)
图1.5 全局环境下的数据与函数
· baseenv()返回基本环境,顾名思义是前述第一类基本套件base package的环境,其父环境是下面的空环境(empty environment)。
· emptyenv()返回空环境,是所有环境最终的起源,也就是所有环境的祖先(ancestor),是唯一没有父环境的环境。
· environment()返回当前的环境,如前所述,通常是第一点的全局环境。
search()函数除了可以检查内存中加载了哪些套件,还可以看到attach()函数附加上的数据集,以方便用户进行数据处理与分析,例如下面的longley数据集加载到内存后,可以直接引用数据集的变量名,无须输入数据集名称。虽然看似方便,但读者应该思考有哪些缺点?attach()的反向执行就是detach(),可将搜索路径下的数据集与套件从内存中删除。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P27_1262.jpg?sign=1739426102-7Uj3h7QFbz1xHhgVkRCx3Uu90Ek7J3jT-0-59bc94a56317b787eac2b5685fdd9dc3)
图1.6 全局环境及其父环境图
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P27_19827.jpg?sign=1739426102-ZT928237bAVCi0B3Uh1OPJD9zdwEotBW-0-6003bcf52fb7e40e21654d00d8abe04a)
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P28_19828.jpg?sign=1739426102-lIY5RjU0Lob9PfSKlE9XAiVCbt9pZ4ox-0-667deadf4d164681010d29d3493749aa)
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P29_19829.jpg?sign=1739426102-JGmJEDnawNLgADW1Y0PjxPZX34V3JlmI-0-f86122ad7eaf4a6cff9419975cdf45b4)
objects()和ls()函数也常用来查询特定环境中的对象名称,例如全局环境与基本环境中的对象。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P30_19831.jpg?sign=1739426102-PEAWXw2M1lmHhmYDTUv1WDGqJOTVegSR-0-c21ccc2345935adbcd285158f5ef70c2)
除了环境外,当前工作目录(或称路径)是R读写文件的默认文件夹,因此读者需熟悉工作目录的查询与设定,方能顺利地读写文件。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P30_19832.jpg?sign=1739426102-ScjhjxghRsJfFQE3fLEghdBXI0n7wFAF-0-9e2f1af735b9be440a7723a400bdedcb)
接下来简单介绍辅助说明,R语言有相当丰富的辅助说明,help.start()返回核心开发团队编制的使用手册、套件参考指南与其他文件。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P30_1372.jpg?sign=1739426102-llGfRy4Rx9Rhasi13tweWZjHHTmVOaNt-0-7a7105ae0196a1ac46b8785365cfb589)
如果已经明确知道欲查询的函数名或数据集名,可以使用help()函数或其别名(alias)运算符?。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P30_1379.jpg?sign=1739426102-xQo9mga46kJuAcwd9pWJzRcraSHSuJPH-0-7779d1d4c9517665652293496212748b)
若搜索名称不确定时,则使用help.search()函数扩大搜索范围,从套件短文(vignette)名称、示范代码与说明页面(标题与关键词)中搜索包含“plot”的字符串,??则为help.search()函数的别名。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P31_20050.jpg?sign=1739426102-OoOVmj3zSefLYVv5jO8x8U8Ej0xYxWKq-0-c919fdf9880ddea2c44e4e190312af39)
上面搜索的范围如果太大,可以使用apropos()函数只搜索函数名称中包含字符串"plot"的函数。而find()函数是搜索包含plot函数的套件,参数simple.words=FALSE时会扩大搜索包含"plot"字符串的所有对象。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P31_19839.jpg?sign=1739426102-PVgPvJDpTVLbAkn9cInNbLWDY3Cg7Ssh-0-e0301eec7f9098c5a583805e640720c9)
如欲在互联网上寻求帮助,读者可访问下列网站并输入搜索关键词:
· Google: http://www.google.com/
· Rseek: http://rseek.org/
· Crantastic: http://crantastic.org/
Python语言可以使用pwd查询当前的工作路径,查阅辅助说明也是使用help()函数。当dir()函数不带参数时,返回当前环境内的变量、方法和定义的类别;当dir()函数带环境参数(即套件或对象)时,返回环境的属性与方法(参见1.6节编程范式与面向对象概念)。