Rcpp自由变量的范围

时间:2015-03-05 13:54:51

标签: r rcpp scoping

假设我有一个C ++函数dosomething(z),它有一个输入变量z,但也有一个" free"位于其中的变量(比如y)。我希望能够设计范围,以便在运行Rcpp函数时,它会在调用它的R函数中找到自由变量。

function(x) {
y = x^2
Rcpp::sourceCpp('C:/Users/xxx/dosomething.cpp')
dosomething(z)
}

所以在上面,我希望dosomething(z)函数使用R函数中定义的y值?如何使用Rcpp的环境功能来实现这一目标?目前,我似乎只能通过在全局环境中找到它们来获得自由变量(而不是直接在R函数中)。

1 个答案:

答案 0 :(得分:2)

Rcpp没有直接处理此问题的内容,但您可以在sys.frames函数中使用C++查询这些框架(您只需要知道Rcpp添加7帧只是为了调用sys.frames),例如:

#include <Rcpp.h>
using namespace Rcpp ;

Environment get_calling_env(){
    Function sys_frames( "sys.frames" ) ;
    List frames = sys_frames() ;

    Environment parent = frames.size() == 7 ? R_GlobalEnv : frames[ frames.size() - 8 ] ;
    return parent ;      
}

// [[Rcpp::export]]
CharacterVector foo(){   
    Environment parent = get_calling_env() ;
    return parent.ls(false) ;
}

get_calling_env为您提供调用函数的环境。这样我们就可以从该环境中获取变量列表:

> f <- function(){ y <- 2; foo() }
# called from a function that calls foo, we get y
> f()
[1] "y"
# if called from the top, we just get the global env
> foo()
[1] "f"   "foo"