Reading variables from a global environment using built-in Rcpp?

I follow an example from Vignette with Rcpp support, tried it with the built-in.

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

but I get a compilation error.

 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 

What is wrong and is there a way to fix this? This is just an example of a toy, I have a more important complex problem depending on the answer to this question.

+4
source share
1 answer

Thank you for your interest in Rcpp ! Romain and I usually assume that questions will be asked on the rcpp-devel list; you probably get some more suitable eyeballs.

Here you are trapped in single and double quotes. Switching these features makes it all work. I also reordered / rearranged / rewritten the code a bit while I played with it:

 > 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 > 

Edit: what it's worth is the same thing, but transferring the environment down. This is what I played with the first and which I somehow like better

 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) 
+6
source

All Articles