Lesen Sie Variablen aus der globalen Umwelt mit Inline-RCPP?
Frage
Ich folge dem Beispiel aus dem RCPP Intro Vignette, es mit Inline versuchen.
f<-cxxfunction(signature(), plugin="Rcpp", body="
Environment global = Environment::global_env();
std::vector<double> vx = global['x'];
")
, aber ich einen Compiler-Fehler erhalten.
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
Was ist falsch und ist es eine Möglichkeit, dieses Problem beheben? Dies ist nur das Spielzeug Beispiel, ich habe ein wichtiges kompliziertes Problem in Abhängigkeit von der Antwort auf diesem.
Lösung
Vielen Dank für Ihr Interesse an RCPP ! Romain und ich schlage vor, in der Regel, dass Fragen über die RCPP-devel Liste gestellt werden; Sie sind wahrscheinlich ein paar geeignetere Augäpfel dorthin zu gelangen.
Hier fiel man in eine Falle einzelner gegen doppelte Anführungszeichen. Schalt diese machen es um alle Arbeiten. I neu geordnet auch / neu angeordneten / relabeled des Code ein wenig, während ich mit ihm spielt:
> 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: Für was es wert ist, hier ist die gleiche, aber eine Umgebung nach unten verläuft. Das ist, was ich mit dem ersten gespielt und die ich irgendwie wie besser
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)