Pacchetti e namespace

Programmazione R difensiva

Dr. Colin Gillespie

Jumping Rivers

Il tuo ambiente globale

  • L'ambiente predefinito è .GlobalEnv
  • Gli oggetti sono memorizzati negli ambienti
  • Per vedere il contenuto, usa ls()
  • Questo ambiente si riempie in fretta
  • Possiamo iniziare a confondere gli oggetti
n
# o volevo
N
Programmazione R difensiva

Pacchetti e ambienti

  • I pacchetti usano i namespace come spazi dei nomi
    • Puoi vederli come una scatola che contiene il pacchetto
  • Un namespace aiuta a tenere ordine
    • Un po' come le cartelle
Programmazione R difensiva

Funzioni esportate

  • library() ti dà accesso diretto a questa scatola del pacchetto
  • library("dplyr") dà accesso diretto alle funzioni esportate di dplyr
## 238 exported functions
getNamespaceExports("dplyr")
  • In alternativa, possiamo usare :: per accedere direttamente a una funzione
## La funzione filter di dplyr
dplyr::filter
Programmazione R difensiva

Le stesse idee, indipendentemente

  • A volte gli autori dei pacchetti usano lo stesso nome di funzione
## La funzione filter()
stats::filter()
dplyr::filter()
  • Se digito filter() quale versione ottengo?
  • Dipende dall'ordine di caricamento dei pacchetti!
Programmazione R difensiva

Le stesse idee, indipendentemente

  • search() in soccorso
search()
# [1] ".GlobalEnv"         "package:dplyr"      "package:stats"  
# <Other packages>
Programmazione R difensiva

Sii difensivo

I conflitti di namespace non sono solo fastidiosi

  • Possono causare bug difficili da diagnosticare
Programmazione R difensiva

Il pacchetto conflicted rende la scelta della funzione esplicita

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")
Programmazione R difensiva

Sveglia!

Programmazione R difensiva

Preparing Video For Download...