Пакеты и пространства имён

Защитное программирование на R

Dr. Colin Gillespie

Jumping Rivers

Глобальная среда

  • Среда по умолчанию — .GlobalEnv
  • Объекты хранятся в средах
  • Для просмотра содержимого используйте ls()
  • Эта среда быстро заполняется
  • Объекты можно перепутать между собой
n
# or did I want
N
Защитное программирование на R

Пакеты и среды

  • Пакеты используют пространства имён для хранения имён
    • Пространство имён можно представить как контейнер пакета
  • Пространство имён помогает поддерживать порядок
    • Как папки на компьютере
Защитное программирование на R

Экспортируемые функции

  • library() открывает прямой доступ к контейнеру пакета
  • library("dplyr") даёт прямой доступ к экспортируемым функциям dplyr
## 238 exported functions
getNamespaceExports("dplyr")
  • Также можно использовать :: для прямого обращения к функции
## The filter function from dplyr
dplyr::filter
Защитное программирование на R

Совпадение имён функций

  • Иногда авторы разных пакетов дают функциям одинаковые имена
## The filter() function
stats::filter()
dplyr::filter()
  • Если ввести filter(), какая версия будет вызвана?
  • Это зависит от порядка загрузки пакетов!
Защитное программирование на R

Совпадение имён функций

  • На помощь приходит search()
search()
# [1] ".GlobalEnv"         "package:dplyr"      "package:stats"  
# <Other packages>
Защитное программирование на R

Будьте осторожны

Конфликты пространств имён — не просто неудобство:

  • Они могут приводить к трудноуловимым ошибкам
Защитное программирование на R

Пакет conflicted заставляет делать выбор функции явным

library("conflicted")
library("dplyr")
filter
#Error: [conflicted] `filter` found in 2 packages.
#Either pick the one you want with `::` 
# * dplyr::filter
# * stats::filter
#Or declare a preference with `conflict_prefer()`
# * conflict_prefer("filter", "dplyr")
# * conflict_prefer("filter", "stats")
Защитное программирование на R

Давайте потренируемся!

Защитное программирование на R

Preparing Video For Download...