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.