Пакети та простори імен

Оборонне програмування 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")
  • Або можна використовувати :: для прямого доступу до функції
## Функція filter з 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...