Lire les variables de l'environnement global avec CRPP de ligne?
Question
Je suis l'exemple de la CRPP introduction Vignetage, essayer avec ligne.
f<-cxxfunction(signature(), plugin="Rcpp", body="
Environment global = Environment::global_env();
std::vector<double> vx = global['x'];
")
mais je reçois 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 de jouet, j'ai un problème complexe le plus important en fonction de la réponse à cette question.
La solution
Merci pour votre intérêt dans CRPP ! Romain et je suggère souvent que les questions se poser sur la liste des CRPP-devel; vous obtenez probablement quelques globes oculaires conviendraient mieux.
Ici, vous êtes tombé dans un piège simple contre des guillemets doubles. Switching ceux-ci font fonctionner le tout autour. J'ai aussi réorganisés / réarrangé / réétiqueté un peu le code pendant que je joue avec lui:
> 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. Voilà ce que je jouais avec la première et que je en quelque sorte comme meilleur
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)