Paket och namnrymder

Defensiv R-programmering

Dr. Colin Gillespie

Jumping Rivers

Din globala miljö

  • Standardmiljön är .GlobalEnv
  • Objekt lagras i miljöer
  • Använd ls() för att se innehållet
  • Den här miljön fylls snabbt upp
  • Objekt kan börja blandas ihop
n
# or did I want
N
Defensiv R-programmering

Paket och miljöer

  • Paket använder namnrymder som utrymmen för namn
    • Se en namnrymd som en låda som innehåller paketet
  • En namnrymd håller saker ordnade
    • Ungefär som mappar
Defensiv R-programmering

Exporterade funktioner

  • library() ger dig direkt åtkomst till paketets låda
  • library("dplyr") ger dig direkt åtkomst till de exporterade funktionerna i dplyr
## 238 exported functions
getNamespaceExports("dplyr")
  • Alternativt kan du använda :: för att komma åt en funktion direkt
## The filter function from dplyr
dplyr::filter
Defensiv R-programmering

Stora hjärnor tänker lika

  • Ibland använder olika paketförfattare samma funktionsnamn
## The filter() function
stats::filter()
dplyr::filter()
  • Om jag skriver filter() – vilken version används?
  • Det beror på i vilken ordning paketen laddades!
Defensiv R-programmering

Stora hjärnor tänker lika

  • search() kommer till undsättning
search()
# [1] ".GlobalEnv"         "package:dplyr"      "package:stats"  
# <Other packages>
Defensiv R-programmering

Var defensiv

Namnrymdskonflikter är mer än bara ett besvär

  • De kan leda till buggar som är svåra att diagnostisera
Defensiv R-programmering

Paketet conflicted gör ditt funktionsval 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")
Defensiv R-programmering

Nu kör vi en övning!

Defensiv R-programmering

Preparing Video For Download...