工作区和环境有什么区别?

时间:2020-04-01 00:58:02

标签: r

R简介

在R会话期间,按名称创建和存储对象(我们 在下一节中讨论此过程)。 R命令

> objects()

(或者,ls())可用于显示(大部分)的名称 当前存储在R中的对象。 当前存储的对象称为工作区

R语言定义

2.1.10环境

环境可以被认为是由两部分组成。一个框架, 由一组符号值对,一个外壳,一个指针组成 到封闭的环境。当R查找符号的值时 检查框架,如果找到匹配的符号,其值将 被退回。如果不是,则访问封闭环境并 重复此过程。 环境形成树形结构,其中围墙起着父母的作用。

3.5.1全球环境

全局环境用户工作区的根。命令行中的赋值操作将导致相关 对象属于全球环境。它的包围 环境是搜索路径上的下一个环境,依此类推 到作为底座外壳的空环境中 环境。

工作空间和环境有什么区别?

工作空间是当前环境,还是当前环境树,还是其他?

谢谢。

1 个答案:

答案 0 :(得分:1)

环境的目的是将一组名称绑定到一组值( Advanced R ,第124页)。 R中的环境存在于一组父/子关系中,从一个没有父项的环境empty environment开始。它的子级是base environment,即基础R包的环境。

当一个人通过library()将包加载到R会话中时,这些包的环境将插入在base environmentglobal environment之间。

global environment是在R会话中存储用户定义的对象的环境。此环境与workspace相同,代表R用户正常工作的区域。

使用search()函数可以看到环境列表。例如,当我启动RStudio时,在环境链中列出了所有在启动时加载的软件包,从base软件包开始:

> # after starting R, what environments exist?
> search()
 [1] ".GlobalEnv"        "tools:rstudio"     "package:stats"     "package:graphics" 
 [5] "package:grDevices" "package:utils"     "package:datasets"  "package:methods"  
 [9] "Autoloads"         "package:base"     
> 

当我加载另一个包时,它被插入到.GlobalEnvtools:studio之间的环境链中。

library(randomForest)
randomForest 4.6-14
Type rfNews() to see new features/changes/bug fixes.
> search()
 [1] ".GlobalEnv"           "package:randomForest" "tools:rstudio"       
 [4] "package:stats"        "package:graphics"     "package:grDevices"   
 [7] "package:utils"        "package:datasets"     "package:methods"     
[10] "Autoloads"            "package:base"        
> 

当R解释对象引用时,它首先在当前环境(可能是全局环境中的一个封闭空间)中查找,然后导航父链,直到它在原始引用中找到具有名称的对象,或者到达空旷的环境。在 Advanced R 中,Hadley Wickham举例说明了搜索路径。

Search Path -- Advanced R p. 127

搜索路径很重要,因为如果两个或多个程序包具有相同名称的对象,则R会解析其在搜索路径中找到的第一个匹配项的引用。

当新加载的程序包中的一个对象掩盖了先前加载的程序包中的对象时,

R会生成警告。例如,当我们在RStudio中运行library(caret)时,R会生成以下消息。

> library(caret)
Loading required package: lattice
Loading required package: ggplot2

Attaching package: ‘ggplot2’

The following object is masked from ‘package:randomForest’:

    margin

> 

这时,对margin()函数的引用将使用ggplot2中的那个,而不是randomForest中的那个。但是,我们可以使用::运算符来显式引用对象的包名称,例如randomForest::margin()

参考 Advanced R ,Wickham,Hadley,CRC Press,2015。