自由变量的 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"
假设我有一个 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"