假设我有一个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函数中)。
答案 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"