包与命名空间

R 防御式编程

Dr. Colin Gillespie

Jumping Rivers

你的全局环境

  • 默认环境是 .GlobalEnv
  • 对象存储在环境中
  • ls() 查看内容
  • 该环境很快会被填满
  • 我们会开始把对象混淆
n
# 或者我想要的是
N
R 防御式编程

包与环境

  • 包使用"命名空间"来作为名称的空间
    • 可把命名空间想成装着包的盒子
  • 命名空间有助于保持整洁
    • 类似文件夹
R 防御式编程

导出函数

  • library() 让你直接访问这个"包盒子"
  • library("dplyr") 让你直接访问 dplyr 的导出函数
## 238 exported functions
getNamespaceExports("dplyr")
  • 也可用 :: 直接访问某个函数
## 来自 dplyr 的 filter 函数
dplyr::filter
R 防御式编程

英雄所见略同

  • 有时不同包作者会使用相同的函数名
## filter() 函数
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...