【问题标题】:Any way to access function installed by makeActiveBinding?有什么方法可以访问 makeActiveBinding 安装的功能?
【发布时间】:2013-04-17 20:21:59
【问题描述】:

标题基本上说明了一切。

如果我这样做......

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

...那么我有什么方法可以检查x 以了解它所链接的功能(如果没有,为什么不链接)?

(在这种情况下,我希望能够知道x 被定义为function() runif(2)。)

【问题讨论】:

  • Romain Francois 建议使用patch to R-devel in 2009 来修改此行为 (see the link to attachment with C code)
  • @Andrie 这个补丁没有给出绑定功能,只是打印出这确实是一个主动绑定
  • @Andrie 很有趣,但是 IIUC,看起来 Romain 的补丁对str(x) 所做的所有事情都是打印(或者更确切地说是cat())字符串“\n”。这也是你看到的吗?
  • @RomainFrancois -- 你是否理解,除了 C 级黑客攻击之外,活动绑定的细节(包括它引用的 R 函数)是隐藏的?我所要求的是否与希望看到一个承诺对象的内部相似,在它不可能的情况下? (意思是故意隐藏的吗?)
  • 看起来确实很隐蔽。

标签: r scoping


【解决方案1】:

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

将其保存到.cpp 文件中,sourceCpp 并与此 R 代码一起使用:

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

【讨论】:

  • 这里我们不一定需要Rcpp。我只是喜欢使用sourceCpp
猜你喜欢
  • 2014-09-20
  • 2020-12-21
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多