2010-09-08 9 views
4

Je suis l'exemple de la vignette Rcpp intro, en l'essayant avec inline.Lire les variables de l'environnement global avec Rcpp inline?

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

mais j'obtiens une erreur de compilation.

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 

Quel est le problème et est-il un moyen de résoudre ce problème? Ceci est juste l'exemple du jouet, j'ai un problème compliqué plus important en fonction de la réponse à cette question.

Répondre

6

Merci de votre intérêt pour Rcpp! Romain et moi suggérons généralement que des questions soient posées sur la liste rcpp-devel; vous obtenez probablement quelques globes oculaires plus appropriés.

Ici, vous êtes tombé dans un piège de guillemets simples ou doubles. En les commutant, tout fonctionne. J'ai aussi réorganisés/réarrangé/réétiqueté un peu le code, alors que je jouais avec elle:

> 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: Pour ce que ça vaut la peine, voici le même, mais le passage d'un environnement vers le bas. C'est ce que j'ai joué avec d'abord et que je préfère en quelque sorte

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) 
Questions connexes