自由变量的 Rcpp 作用域

Rcpp scoping of free variables

假设我有一个 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 函数中)找到它们来使自由变量工作。

Rcpp 没有直接处理这个的东西,但是你可以从 C++ 函数中用 sys.frames 查询帧(你只需要知道 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"