Pachete și spații de nume

Programare defensivă în R

Dr. Colin Gillespie

Jumping Rivers

Mediul global

  • Mediul implicit este .GlobalEnv
  • Obiectele sunt stocate în medii
  • Pentru a vizualiza conținutul, utilizați ls()
  • Acest mediu se umple rapid
  • Putem începe să confundăm obiectele
n
# or did I want
N
Programare defensivă în R

Pachete și medii

  • Pachetele folosesc spații de nume pentru a organiza numele
    • Un spațiu de nume poate fi gândit ca o cutie ce conține pachetul
  • Un spațiu de nume ajută la menținerea ordinii
    • Asemănător folderelor
Programare defensivă în R

Funcții exportate

  • library() oferă acces direct la pachet
  • library("dplyr") oferă acces direct la funcțiile exportate din dplyr
## 238 exported functions
getNamespaceExports("dplyr")
  • Alternativ, putem folosi :: pentru a accesa direct o funcție
## The filter function from dplyr
dplyr::filter
Programare defensivă în R

Mințile luminate se întâlnesc

  • Uneori, autorii de pachete folosesc același nume de funcție
## The filter() function
stats::filter()
dplyr::filter()
  • Dacă scriu filter(), ce versiune obțin?
  • Depinde de ordinea în care sunt încărcate pachetele!
Programare defensivă în R

Mințile luminate se întâlnesc

  • search() vine în ajutor
search()
# [1] ".GlobalEnv"         "package:dplyr"      "package:stats"  
# <Other packages>
Programare defensivă în R

Fiți precauți

Conflictele de spații de nume nu sunt doar o problemă

  • Pot genera erori greu de diagnosticat
Programare defensivă în R

Pachetul conflicted face alegerea funcției explicită

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")
Programare defensivă în R

Timp să ne trezim

Programare defensivă în R

Preparing Video For Download...