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.

Était-ce utile?

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) 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top