Packages en namespaces

Defensief programmeren in R

Dr. Colin Gillespie

Jumping Rivers

Je globale omgeving

  • De standaardomgeving is .GlobalEnv
  • Objecten staan in omgevingen
  • Bekijk de inhoud met ls()
  • Deze omgeving zit snel vol
  • Dan gaan we objecten door elkaar halen
n
# of bedoelde ik
N
Defensief programmeren in R

Packages en omgevingen

  • Packages gebruiken namespaces als naamruimtes
    • Zie een namespace als een doos met de package erin
  • Een namespace houdt dingen netjes
    • Zoals mappen
Defensief programmeren in R

Geëxporteerde functies

  • library() geeft je directe toegang tot die packagedoos
  • library("dplyr") geeft directe toegang tot de geëxporteerde functies in dplyr
## 238 exported functions
getNamespaceExports("dplyr")
  • Of gebruik :: om een functie direct aan te roepen
## De filter-functie uit dplyr
dplyr::filter
Defensief programmeren in R

Great minds think alike

  • Soms hebben packages dezelfde functienaam
## De functie filter()
stats::filter()
dplyr::filter()
  • Als ik filter() typ, welke krijg ik dan?
  • Dat hangt af van de laadvollgorde!
Defensief programmeren in R

Great minds think alike

  • search() helpt je hierbij
search()
# [1] ".GlobalEnv"         "package:dplyr"      "package:stats"  
# <Other packages>
Defensief programmeren in R

Wees defensief

Namespace-conflicten zijn meer dan vervelend

  • Ze kunnen tot lastig te vinden bugs leiden
Defensief programmeren in R

De conflicted-package maakt je functiekeuze expliciet

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")
Defensief programmeren in R

Tijd om wakker te worden

Defensief programmeren in R

Preparing Video For Download...