10.2 Namespace

10.2.1 Motivation

  • Namespace provides context for looking up value of an object associated with a name.
  • Example: :: operator:
library(lubridate)    |  library(here)
library(here)         |  library(lubridate)

here() # here::here() |  here() # lubridate::here()
  • Recommended to use package::function() for dependencies in code below R/
  • Package namespace saves us from potential user redefinitions of functions
  • (There are other ways than using :: to address potential name conflicts.)

10.2.2 The NAMESPACE file

Example:

# Generated by roxygen2: do not edit by hand

S3method(compare,character)
S3method(print,testthat_results)
export(compare)
export(expect_equal)
import(rlang)
importFrom(brio,readLines)
useDynLib(testthat, .registration = TRUE)

Each line contains a directive:

  • export(): export a function (including S3 and S4 generics).
  • S3method(): export an S3 method.
  • importFrom(): import selected object from another namespace (including S4 generics).
  • import(): import all objects from another package’s namespace. package.
  • useDynLib(): registers routines from a DLL.

Each line is generated by roxygen2. This method is preferred because:

  • Namespace tags are integrated into source code
  • Only need to learn @export and roxygen2 figures out the specific directive
  • Roxygen2 takes on the burden of writing NAMESPACE in a neat and tidy manner