Pacotes e Namespaces

Programação Defensiva em R

Dr. Colin Gillespie

Jumping Rivers

Seu ambiente global

  • O ambiente padrão é o .GlobalEnv
  • Objetos ficam guardados em ambientes
  • Para ver o conteúdo, use ls()
  • Este ambiente enche rápido
  • Podemos começar a confundir objetos
n
# ou eu queria
N
Programação Defensiva em R

Pacotes e ambientes

  • Pacotes usam namespaces como "espaços de nomes"
    • Pense em um namespace como uma caixa que contém o pacote
  • Um namespace ajuda a manter tudo organizado
    • Tipo pastas
Programação Defensiva em R

Funções exportadas

  • library() dá acesso direto a essa "caixa" do pacote
  • library("dplyr") dá acesso direto às funções exportadas do dplyr
## 238 exported functions
getNamespaceExports("dplyr")
  • Como alternativa, podemos usar :: para acessar uma função diretamente
## A função filter do dplyr
dplyr::filter
Programação Defensiva em R

Mentes brilhantes pensam igual

  • Às vezes autores de pacotes usam o mesmo nome de função
## A função filter()
stats::filter()
dplyr::filter()
  • Se eu digitar filter(), qual versão eu obtenho?
  • Depende da ordem de carregamento dos pacotes!
Programação Defensiva em R

Mentes brilhantes pensam igual

  • search() para salvar o dia
search()
# [1] ".GlobalEnv"         "package:dplyr"      "package:stats"  
# <Other packages>
Programação Defensiva em R

Seja preventivo

Conflitos de namespace são mais que um incômodo

  • Podem gerar bugs difíceis de diagnosticar
Programação Defensiva em R

O pacote conflicted tenta tornar sua escolha de função explícita

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")
Programação Defensiva em R

Hora de acordar

Programação Defensiva em R

Preparing Video For Download...