2013-04-17 15 views
12

Tytuł w zasadzie mówi wszystko.Jakikolwiek sposób na dostęp do funkcji zainstalowanej przez makeActiveBinding?

Jeśli mogę to zrobić ...

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

... czy jest jakiś sposób, wtedy dla mnie zbadać x aby dowiedzieć się jaka funkcja jest związana z (a jeśli nie, to dlaczego)?

(. W tym przypadku, chciałbym być w stanie dowiedzieć się, że x została zdefiniowana jako function() runif(2))

+0

Romain Francois sUG w celu zmodyfikowania tego zachowania ([patch to R-devel 2009] (https://stat.ethz.ch/pipermail/r-devel/2009-June/053899.html) (patrz link do załącznika z kodem C ] (https://stat.ethz.ch/pipermail/r-devel/attachments/20090629/16a8c41a/attachment.pl)) – Andrie

+0

@Andrie ta poprawka nie dała funkcji bindowania, wystarczy wydrukować, że jest to rzeczywiście aktywne powiązanie –

+0

@Andrie Interesujące, ale IIUC, nadal wygląda tak, jak zrobiłaby to łata Romaina dla 'str (x)' byłoby wydrukować (lub raczej 'cat()') ciąg " \ n". Czy to też widzisz? –

Odpowiedz

11

Przy odrobinie noodling wokół w envir.c mogę uzyskać to do pracy:

#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 ; 
} 

Zapisz to w pliku .cpp, sourceCpp go i używać go z tego kodu R:

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

Nie potrzebujemy tutaj 'Rcpp'. Po prostu lubię używać 'sourceCpp' –

+2

W porządku - to całkiem imponujące. Dzięki! –

Powiązane problemy