Skip to contents

Check various common "gotchas" in .onLoad(), .onAttach(), .Last.lib(), and .onDetach() namespace hooks that will cause R CMD check issues. See Writing R Extensions for details.

Usage

package_hooks_linter()

Details

  1. .onLoad() shouldn't call cat(), message(), print(), writeLines(), packageStartupMessage(), require(), library(), or installed.packages().

  2. .onAttach() shouldn't call cat(), message(), print(), writeLines(), library.dynam(), require(), library(), or installed.packages().

  3. .Last.lib() and .onDetach() shouldn't call library.dynam.unload().

  4. .onLoad() and .onAttach() should take two arguments, with names matching ^lib and ^pkg; .Last.lib() and .onDetach() should take one argument with name matching ^lib.

See also

linters for a complete list of linters available in lintr.

Examples

# will produce lints
lint(
  text = ".onLoad <- function(lib, ...) { }",
  linters = package_hooks_linter()
)
#> <text>:1:12: warning: [package_hooks_linter] .onLoad() should take two arguments, with the first starting with 'lib' and the second starting with 'pkg'.
#> .onLoad <- function(lib, ...) { }
#>            ^~~~~~~~~~~~~~~~~~~~~~

lint(
  text = ".onAttach <- function(lib, pkg) { require(foo) }",
  linters = package_hooks_linter()
)
#> <text>:1:35: warning: [package_hooks_linter] Don't alter the search() path in .onAttach() by calling require().
#> .onAttach <- function(lib, pkg) { require(foo) }
#>                                   ^~~~~~~

lint(
  text = ".onDetach <- function(pkg) { }",
  linters = package_hooks_linter()
)
#> <text>:1:14: warning: [package_hooks_linter] .onDetach() should take one argument starting with 'lib'.
#> .onDetach <- function(pkg) { }
#>              ^~~~~~~~~~~~~~~~~

# okay
lint(
  text = ".onLoad <- function(lib, pkg) { }",
  linters = package_hooks_linter()
)
#>  No lints found.

lint(
  text = '.onAttach <- function(lib, pkg) { loadNamespace("foo") }',
  linters = package_hooks_linter()
)
#>  No lints found.

lint(
  text = ".onDetach <- function(lib) { }",
  linters = package_hooks_linter()
)
#>  No lints found.