套件與命名空間

R 防禦式程式設計

Dr. Colin Gillespie

Jumping Rivers

你的全域環境

  • 預設環境是 .GlobalEnv
  • 物件儲存在環境中
  • 檢視內容可用 ls()
  • 這個環境很快就會塞滿
  • 你可能開始把物件搞混
n
# or did I want
N
R 防禦式程式設計

套件與環境

  • 套件用「命名空間」來放名稱
    • 命名空間就像裝著套件的盒子
  • 命名空間可保持整齊
    • 有點像資料夾
R 防禦式程式設計

匯出函式

  • library() 讓你直接存取這個套件盒
  • library("dplyr") 讓你直接使用 dplyr 中匯出的函式
## 238 exported functions
getNamespaceExports("dplyr")
  • 或者,用 :: 直接呼叫某個函式
## The filter function from dplyr
dplyr::filter
R 防禦式程式設計

英雖同工,名卻相撞

  • 有時不同套件作者會用到同名函式
## The filter() function
stats::filter()
dplyr::filter()
  • 若我直接打 filter() 會用到哪個版本?
  • 取決於套件載入順序!
R 防禦式程式設計

英雖同工,名卻相撞

  • 用 search() 來救援
search()
# [1] ".GlobalEnv"         "package:dplyr"      "package:stats"  
# <Other packages>
R 防禦式程式設計

防禦式思維

命名空間衝突不只是惱人,

  • 還可能導致難以診斷的臭蟲。
R 防禦式程式設計

conflicted 套件會讓你必須「明確」選擇要用的函式

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")
R 防禦式程式設計

該醒來了

R 防禦式程式設計

Preparing Video For Download...