اقرأ المتغيرات من البيئة العالمية مع RCPP المضمّن؟
سؤال
أنا أتابع المثال من المقلاة المقدمة RCPP ، وأحاول ذلك مع الخط.
f<-cxxfunction(signature(), plugin="Rcpp", body="
Environment global = Environment::global_env();
std::vector<double> vx = global['x'];
")
لكني أحصل على خطأ في التجميع.
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
ما هو الخطأ وهل هناك طريقة لإصلاح هذا؟ هذا مجرد مثال لعبة ، لدي مشكلة معقدة أكثر أهمية اعتمادًا على الإجابة على هذا.
المحلول
شكرا لاهتمامك في RCPP! عادةً ما أقترح رومان ورومين أن يتم طرح الأسئلة على قائمة RCPP-Devel ؛ ربما تحصل على عدد قليل من مقل العيون هناك.
هنا ، وقعت في فخ واحد مقابل اقتباسات مزدوجة. تبديل هذه حول جعل كل شيء يعمل. قمت أيضًا بإعادة ترتيب / إعادة ترتيب / إعادة تهيئة الكود قليلاً كنت ألعب معها:
> 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
>
يحرر: لما يستحق ، هنا هو نفسه ولكن تمرير بيئة لأسفل. هذا ما لعبت معه أولاً وأحبه بطريقة أو بأخرى
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)
لا تنتمي إلى StackOverflow