bindenv                 package:base                 R Documentation

_B_i_n_d_i_n_g _a_n_d _E_n_v_i_r_o_n_m_e_n_t _A_d_j_u_s_t_m_e_n_t_s

_D_e_s_c_r_i_p_t_i_o_n:

     These functions represent an experimental interface for
     adjustments to environments and bindings within environments. 
     They allow for locking environments as well as individual
     bindings, and for linking a variable to a function.

_U_s_a_g_e:

     lockEnvironment(env, bindings = FALSE)
     environmentIsLocked(env)
     lockBinding(sym, env)
     unlockBinding(sym, env)
     bindingIsLocked(sym, env)
     makeActiveBinding(sym, fun, env)
     bindingIsActive(sym, env)

_A_r_g_u_m_e_n_t_s:

     env: an environment.

bindings: logical specifying whether bindings should be locked.

     sym: a name object or character string

     fun: a function taking zero or one arguments

_D_e_t_a_i_l_s:

     The function 'lockEnvironment' locks its environment argument,
     which must be a proper environment, not NULL.  Locking the NULL
     (base) environment may be supported later.  Locking the
     environment prevents adding or removing variable bindings from the
     environment. Changing the value of a variable is still possible
     unless the binding has been locked.

     'lockBinding' locks individual bindings in the specified
     environment.  The value of a locked binding cannot be changed.
     Locked bindings may be removed from an environment unless the
     environment is locked.

     'makeActiveBinding' installs 'fun' so that getting the value of
     'sym' calls 'fun' with no arguments, and assigning to 'sym' calls
     'fun' with one argument, the value to be assigned.  This allows
     things like C variables linked to R variables and variables linked
     to data bases to be implemented.  It may also be useful for making
     thread-safe versions of some system globals.

_A_u_t_h_o_r(_s):

     Luke Tierney

_E_x_a_m_p_l_e_s:

     # locking environments
     e <- new.env()
     assign("x", 1, env = e)
     get("x", env = e)
     lockEnvironment(e)
     get("x", env = e)
     assign("x", 2, env = e)
     try(assign("y", 2, env = e)) # error

     # locking bindings
     e <- new.env()
     assign("x", 1, env = e)
     get("x", env = e)
     lockBinding("x", e)
     try(assign("x", 2, env = e)) # error
     unlockBinding("x", e)
     assign("x", 2, env = e)
     get("x", env = e)

     # active bindings
     f <- local( {
         x <- 1
         function(v) {
            if (missing(v))
                cat("get\n")
            else {
                cat("set\n")
                x <<- v
            }
            x
         }
     })
     makeActiveBinding("fred", f, .GlobalEnv)
     bindingIsActive("fred", .GlobalEnv)
     fred
     fred <- 2
     fred

