2013-04-17 33 views
12

Tiêu đề cơ bản nói lên tất cả.Bất kỳ cách nào để truy cập chức năng được cài đặt bởi makeActiveBinding?

Nếu tôi làm điều này ...

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

... là có thì cách nào cho tôi để kiểm tra x để tìm hiểu những gì chức năng nó được liên kết với (và nếu không, tại sao không)?

(. Trong trường hợp này, tôi muốn để có thể biết rằng x được xác định là function() runif(2))

+0

Romain Francois SUG gested một [patch to R-devel trong năm 2009] (https://stat.ethz.ch/pipermail/r-devel/2009-June/053899.html) để sửa đổi hành vi này ([xem liên kết để đính kèm với mã C ] (https://stat.ethz.ch/pipermail/r-devel/attachments/20090629/16a8c41a/attachment.pl)) – Andrie

+0

@Andrie miếng vá này không cung cấp chức năng ràng buộc, chỉ cần in rằng đây thực sự là một ràng buộc hoạt động –

+0

@Andrie Thú vị, nhưng IIUC, nó vẫn trông giống như tất cả các bản vá của Romain sẽ làm cho 'str (x)' sẽ được in (hay đúng hơn là 'cat()') chuỗi " \ n". Đó có phải là những gì bạn thấy không? –

Trả lời

11

Với một chút noodling xung quanh trong envir.c, tôi có thể có được điều này để làm việc:

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

Lưu này vào một tập tin .cpp, sourceCpp nó và sử dụng nó với mã R này:

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

Chúng tôi không nhất thiết cần 'Rcpp' ở đây. Tôi chỉ thích sử dụng 'sourceCpp' –

+2

Được rồi - điều đó khá ấn tượng. Cảm ơn! –

Các vấn đề liên quan