2015-03-05 6 views
0

Скажите, что у меня есть функция C++ dosomething(z), которая имеет единственную входную переменную z, но также и «свободную» переменную, расположенную внутри нее (скажем y). Я хочу, чтобы иметь возможность проектировать область, так что, когда я запускаю функцию Rcpp, она находит свободную переменную внутри функции R, в которой она вызывается.Rcpp scope of free variables

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

Так в приведенном выше, я хочу, чтобы функция dosomething(z) использовать значение у определенного в функции R? Как использовать возможности среды Rcpp для достижения этой цели? В настоящее время я могу просто заставить свободные переменные работать, находя их в глобальной среде (не непосредственно внутри функции R).

+1

Rcpp упрощает _переменные переменные _explicitly_ pass. Я рекомендую использовать эту функцию. –

ответ

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"