use makeActiveBinding inside a package

This is probably something to do in the .onLoad function, something like this in your package:

NAMESPACE <- environment()

la. <- function(){ 
  ls(all = T, envir = globalenv())
}

.onLoad <- function(libname, pkgname) {
  makeActiveBinding("la", la., NAMESPACE)
}

I think this should work:

Lets write two functions inside a package:

# function one
ll_ <- function(){
  ls(envir = globalenv(), all.names = TRUE)
}

# function two
l_ <- function(){
  ls(envir = globalenv(), all.names = FALSE)
}

then write your onLoad() function

# Runs when package is loaeded
.onLoad <- function(libname, pkgname) {
  ns <-  asNamespace(pkgname)
  makeActiveBinding("ll", ll_,  env = ns) 
  makeActiveBinding("l", l_,  env = ns) 
  namespaceExport(ns, c('ll','l'))
}

When loading your packages, commands l and ll. run functions l() and ll()

Finally, I am sure that by embedding all function in a list and playing with functionals, the definition of onLoad() may become much lighter

Thanks Romain for your suggestion


Calling namespaceExport manually causes R CMD check to complain. Instead, the export declaration should be put into the NAMESPACE file.

Or, when using ‘roxygen2’, add the @export tag in front of a dummy NULL object to make it generate the appropriate documentation and NAMESPACE export declaration:

#' List objects
#' @usage la
#' @name la
#' @export
NULL

makeActiveBinding(
    'la',
    function () ls(envir = globalenv(), all.names = TRUE),
    environment()
)

Where

  • @usage causes ‘roxygen’ to generate a “Usage” section, which would otherwise be missing
  • @name tells ‘roxygen2’ the object name, to be used for the export declaration and for the name of the help page (this can be overridden with @rdname if necessary)
  • @export marks the name as exported, as usual.

Note also that the use of .onLoad is not required to declare active bindings: they can be defined directly at namespace/file level.