2013-04-17 5 views
12

タイトルは基本的にそれをすべて言います。makeActiveBindingによってインストールされた関数にアクセスする方法はありますか?

私はこれを行う場合は...

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

...私はそれが(とない、なぜならば)リンクされている機能を学ぶためにxを検討するためにどのような方法、そこですか?

(この場合、私はxfunction() runif(2)としたことを学ぶことができるようにしたいのですが)

+0

ロマンフランソワSUGこの動作を修正するために[2009年のR-develへのパッチ](https://stat.ethz.ch/pipermail/r-devel/2009-June/053899.html)を吟味しました([Cコードでの添付ファイルへのリンクを参照してください] ](https://stat.ethz.ch/pipermail/r-devel/attachments/20090629/16a8c41a/attachment.pl) – Andrie

+0

@Andrieこのパッチはバインディング機能を提供していませんでした。これは実際にアクティブなバインディングであることだけを表示します –

+0

@Andrie興味深いですが、IIUCでは、Romainのパッチが 'str(x)'のために行うように見えるのは、文字列 " \ n"を表示することです(あるいは 'cat()')。それもあなたが見ているものですか? –

答えて

11

envir.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 ; 
} 

sourceCppに、.cppファイルにこれを保存して、このRコードとそれを使用します。

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

「Rcpp」は必ずしも必要ではありません。私は 'sourceCpp'を使用して楽しんでいます –

+2

すべての権利 - それはかなり印象的です。ありがとう! –

関連する問題