Pakiety i przestrzenie nazw

Defensywne programowanie w R

Dr. Colin Gillespie

Jumping Rivers

Globalne środowisko

  • Domyślne środowisko to .GlobalEnv
  • Obiekty są przechowywane w środowiskach
  • Aby wyświetlić zawartość, użyj ls()
  • To środowisko szybko się zapełnia
  • Możemy zacząć mylić obiekty
n
# or did I want
N
Defensywne programowanie w R

Pakiety i środowiska

  • Pakiety używają przestrzeni nazw do przechowywania nazw
    • Przestrzeń nazw można wyobrazić sobie jako pudełko zawierające pakiet
  • Przestrzeń nazw pomaga utrzymać porządek
    • Podobnie jak foldery
Defensywne programowanie w R

Eksportowane funkcje

  • library() daje bezpośredni dostęp do pakietu
  • library("dplyr") daje dostęp do eksportowanych funkcji dplyr
## 238 exported functions
getNamespaceExports("dplyr")
  • Alternatywnie można użyć :: do bezpośredniego dostępu do funkcji
## The filter function from dplyr
dplyr::filter
Defensywne programowanie w R

Wielkie umysły myślą podobnie

  • Czasem autorzy pakietów używają tej samej nazwy funkcji
## The filter() function
stats::filter()
dplyr::filter()
  • Którą wersję otrzymamy, wpisując filter()?
  • To zależy od kolejności ładowania pakietów!
Defensywne programowanie w R

Wielkie umysły myślą podobnie

  • Z pomocą przychodzi search()
search()
# [1] ".GlobalEnv"         "package:dplyr"      "package:stats"  
# <Other packages>
Defensywne programowanie w R

Zachowaj ostrożność

Konflikty przestrzeni nazw to nie tylko problem

  • Mogą prowadzić do trudnych do zdiagnozowania błędów
Defensywne programowanie w R

Pakiet conflicted wymusza jawny wybór funkcji

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")
Defensywne programowanie w R

Czas się obudzić

Defensywne programowanie w R

Preparing Video For Download...