Rev 78086 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
% File src/library/base/man/bindenv.Rd% Part of the R package, https://www.R-project.org% Copyright 1995-2018 R Core Team% Distributed under GPL 2 or later\name{bindenv}\title{Binding and Environment Locking, Active Bindings}\usage{lockEnvironment(env, bindings = FALSE)environmentIsLocked(env)lockBinding(sym, env)unlockBinding(sym, env)bindingIsLocked(sym, env)makeActiveBinding(sym, fun, env)bindingIsActive(sym, env)activeBindingFunction(sym, env)}\alias{bindenv}\alias{lockEnvironment}\alias{environmentIsLocked}\alias{lockBinding}\alias{unlockBinding}\alias{makeActiveBinding}\alias{bindingIsLocked}\alias{bindingIsActive}\alias{activeBindingFunction}\arguments{\item{env}{an environment.}\item{bindings}{logical specifying whether bindings should be locked.}\item{sym}{a name object or character string.}\item{fun}{a function taking zero or one arguments.}}\description{These functions represent an interface for adjustmentsto environments and bindings within environments. They allow forlocking environments as well as individual bindings, and for linkinga variable to a function.}\details{The function \code{lockEnvironment} locks its environment argument.Locking theenvironment prevents adding or removing variable bindings from theenvironment. Changing the value of a variable is still possible unlessthe binding has been locked. The namespace environments of packageswith namespaces are locked when loaded.\code{lockBinding} locks individual bindings in the specifiedenvironment. The value of a locked binding cannot be changed. Lockedbindings may be removed from an environment unless the environment islocked.\code{makeActiveBinding} installs \code{fun} in environment \code{env}so that getting the value of \code{sym} calls \code{fun} with noarguments, and assigning to \code{sym} calls \code{fun} with oneargument, the value to be assigned. This allows the implementation ofthings like C variables linked to \R variables and variables linked todatabases, and is used to implement \code{\link{setRefClass}}. It mayalso be useful for making thread-safe versions of some system globals.Currently active bindings are not preserved during package installation,but they can be created in \code{\link{.onLoad}}.}\value{The \code{bindingIsLocked} and \code{environmentIsLocked} return alength-one logical vector. The remaining functions return\code{NULL}, invisibly.}\examples{# locking environmentse <- new.env()assign("x", 1, envir = e)get("x", envir = e)lockEnvironment(e)get("x", envir = e)assign("x", 2, envir = e)try(assign("y", 2, envir = e)) # error# locking bindingse <- new.env()assign("x", 1, envir = e)get("x", envir = e)lockBinding("x", e)try(assign("x", 2, envir = e)) # errorunlockBinding("x", e)assign("x", 2, envir = e)get("x", envir = e)# active bindingsf <- local( {x <- 1function(v) {if (missing(v))cat("get\n")else {cat("set\n")x <<- v}x}})makeActiveBinding("fred", f, .GlobalEnv)bindingIsActive("fred", .GlobalEnv)fredfred <- 2fred}\keyword{utilities}\author{Luke Tierney}