Целью среды является привязка набора имен к набору значений ( Advanced R , стр. 124). Среды в R существуют в наборе отношений родитель / потомок, начиная с одной среды, у которой нет родителя, empty environment
. Его дочерний элемент - base environment
, среда базового пакета R.
При загрузке пакетов в сеанс R через library()
среды для этих пакетов вставляются между base environment
и global 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"
>
Когда я загружаю другой пакет, он вставляется в цепь окружения между .GlobalEnv
и tools: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 Хэдли Уикхем иллюстрирует путь поиска следующим образом.
![Search Path -- Advanced R p. 127](https://i.stack.imgur.com/U01uB.png)
Путь поиска важен, потому что если два или более пакета имеют объект с одинаковым именем, R разрешает ссылку с первым найденным совпадением в пути поиска.
R генерирует предупреждение, когда вновь загруженный пакет содержит объект, который маскирует объект в ранее загруженном пакете. Например, когда мы запускаем library(caret)
в RStudio, 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, CR C Press 2015.