Search code examples
rscoping

Any way to access function installed by makeActiveBinding?


The title basically says it all.

If I do this ...

makeActiveBinding("x", function() runif(2), .GlobalEnv)
x
# [1] 0.7332872 0.4707796
x
# [1] 0.5500310 0.5013099

... is there then any way for me to examine x to learn what function it is linked to (and if not, why not)?

(In this case, I'd like to be able to learn that x was defined to be function() runif(2).)


Solution

  • With a bit of noodling around in envir.c, I can get this to work:

    #include <Rcpp.h>
    using namespace Rcpp ;
    
    #define HASHSIZE(x)      LENGTH(x)
    #define HASHVALUE(x)    TRUELENGTH(x)
    
    // [[Rcpp::export]]
    SEXP get_binding_fun( std::string name, Environment env){
        SEXP symbol = Rf_install( name.c_str() );
        SEXP tab = HASHTAB(env) ;
        SEXP c = PRINTNAME(symbol);
    
        // finding the hash code for the symbol
        int hashcode = HASHVALUE(c) % HASHSIZE(tab);
    
        // get the value there from the hash table
        SEXP res = CAR( VECTOR_ELT(tab, hashcode ) ) ;
    
        return res ;
    }
    

    Save this into a .cpp file, sourceCpp it and use it with this R code:

    > makeActiveBinding("x", function() runif(2), .GlobalEnv)
    > get_binding_fun("x", .GlobalEnv)
    # function ()
    # runif(2)