Rcpp自由变量的作用域 我说,我有一个C++函数:代码> DOOMETHOST(Z),它有一个输入变量 z < />代码,但也有一个“自由”变量位于它里面(例如,代码> y< /代码>)。我希望能够设计范围,以便在运行Rcpp函数时,它能够在调用它的R函数中找到自由变量 function(x) { y = x^2 Rcpp::sourceCpp('C:/Users/xxx/dosomething.cpp') dosomething(z) }

Rcpp自由变量的作用域 我说,我有一个C++函数:代码> DOOMETHOST(Z),它有一个输入变量 z < />代码,但也有一个“自由”变量位于它里面(例如,代码> y< /代码>)。我希望能够设计范围,以便在运行Rcpp函数时,它能够在调用它的R函数中找到自由变量 function(x) { y = x^2 Rcpp::sourceCpp('C:/Users/xxx/dosomething.cpp') dosomething(z) },r,rcpp,scoping,R,Rcpp,Scoping,在上面,我想让dosomething(z)函数使用R函数中定义的y值?我如何使用Rcpp的环境功能来实现这一点?目前,我似乎只能通过在全局环境中查找自由变量(而不是直接在R函数中)来获取自由变量。Rcpp没有直接处理这个问题的方法,但是您可以从C++函数中使用sys.frames查询框架(您只需知道,Rcpp添加了7个帧即可调用sys.frames),例如: Rcpp使显式传递变量变得容易。我建议您使用该功能。 #include <Rcpp.h> using namespace Rc

在上面,我想让
dosomething(z)
函数使用R函数中定义的y值?我如何使用Rcpp的环境功能来实现这一点?目前,我似乎只能通过在全局环境中查找自由变量(而不是直接在R函数中)来获取自由变量。

Rcpp
没有直接处理这个问题的方法,但是您可以从
C++
函数中使用
sys.frames
查询框架(您只需知道,
Rcpp
添加了7个帧即可调用
sys.frames
),例如:

Rcpp使显式传递变量变得容易。我建议您使用该功能。
#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) ;
}
> 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"