2010-09-08 110 views
4

我正在关注Rcpp intro Vignette中的示例,并尝试使用内联。使用内联Rcpp从全局环境读取变量?

f<-cxxfunction(signature(), plugin="Rcpp", body=" 
    Environment global = Environment::global_env(); 
    std::vector<double> vx = global['x']; 
") 

但我得到一个编译错误。

file12384509.cpp: In function 'SEXPREC* file12384509()': 
file12384509.cpp:31: error: invalid use of incomplete type 'struct SEXPREC' 
C:/PROGRA~1/R/R-211~1.1/include/Rinternals.h:333: error: forward declaration of 'struct SEXPREC' 
file12384509.cpp:31: error: conversion from 'SEXPREC' to non-scalar type 'std::vector<double, std::allocator<double> >' requested 
make: *** [file12384509.o] Error 1 

ERROR(s) during compilation: source code errors or compiler configuration errors! 

Program source: 
    1: // includes from the plugin 
    2: 
    3: #include <Rcpp.h> 
    4: 
    5: 
    6: #ifndef BEGIN_RCPP 
    7: #define BEGIN_RCPP 
    8: #endif 
    9: 
10: #ifndef END_RCPP 
11: #define END_RCPP 
12: #endif 
13: 
14: using namespace Rcpp; 
15: 
16: 
17: // user includes 
18: 
19: 
20: // declaration 
21: extern "C" { 
22: SEXP file12384509() ; 
23: } 
24: 
25: // definition 
26: 
27: SEXP file12384509(){ 
28: BEGIN_RCPP 
29: 
30: Environment global = Environment::global_env(); 
31: std::vector<double> vx = global['x']; 
32: 
33: END_RCPP 
34: } 
35: 
36: 
Error in compileCode(f, code, language = language, verbose = verbose) : 
    Compilation ERROR, function(s)/method(s) not created! file12384509.cpp: In function 'SEXPREC* file12384509()': 
file12384509.cpp:31: error: invalid use of incomplete type 'struct SEXPREC' 
C:/PROGRA~1/R/R-211~1.1/include/Rinternals.h:333: error: forward declaration of 'struct SEXPREC' 
file12384509.cpp:31: error: conversion from 'SEXPREC' to non-scalar type 'std::vector<double, std::allocator<double> >' requested 
make: *** [file12384509.o] Error 1 

什么是错的,有没有办法解决这个问题?这只是玩具的例子,根据对此的回答,我有一个更重要的复杂问题。

回答

6

感谢您对Rcpp的关注!罗曼和我通常建议在rcpp-devel名单上提出问题;你可能会在那里得到更合适的眼球。

在这里,你陷入了单引号对双引号的陷阱。切换这些都可以使其工作。我也重新排序/重排/重新标记的代码一小会儿,我用它玩:

> f <- cxxfunction(signature(), 
+     body=' Environment e = Environment::global_env(); 
+       std::vector<double> vx = e["x"]; 
+       return wrap(vx); ', 
+     plugin="Rcpp") 
> x <- 3:6 
> f() 
[1] 3 4 5 6 
> 

编辑:对于它的价值,这里是相同的,但路过的环境下。这是我第一次玩,我不知何故喜欢更好

f <- cxxfunction(signature(env="environment"), 
       body=' Environment e(env); 
         std::vector<double> vx = e["x"]; 
         return wrap(vx); ', 
       plugin="Rcpp") 

env <- new.env() 
env[["x"]] <- 1:4 
f(env)