2013-01-11 11 views
5

Die XTS_API für C von XTS-0.9-1-Paket bereitgestellt kann nicht direkt in C++ verwendet werden.Wie CAPI von XTS-Paket in Rcpp zu verwenden

Zum Beispiel, wenn ein

schreiben
#include <Rcpp.h> 
extern "C" { 
#include <xts.h> 
} 

using namespace Rcpp; 

RcppExport SEXP get_xts_index(SEXP x, SEXP value) { 
    BEGIN_RCPP 

    return SET_xtsIndexClass(x, value); 

    END_RCPP 
} 

Es wird folgende Compiler Zeitfehler werden:

  • error: expected identifier before ‘)’ token
  • error: ‘install’ was not declared in this scope
  • error: ‘getAttrib’ was not declared in this scope
  • error: ‘setAttrib’ was not declared in this scope
  • error: ‘xts_IndexvalueSymbol’ was not declared in this scope

Wie xts_API für C aufrufen?

Antwort

5

Welche Version von XTS haben Sie? Die folgenden Werke für mich:

library(xts) 
library(inline) 

inc <- ' 
extern "C" { 
#define class xts_class 
#include <xts.h> 
#undef class 
} 


inline SEXP install(const char* x) { 
    return Rf_install(x); 
} 

inline SEXP getAttrib(SEXP a, SEXP b) { 
    return Rf_getAttrib(a, b); 
} 


inline SEXP setAttrib(SEXP a, SEXP b, SEXP c) { 
    return Rf_setAttrib(a, b, c); 
} 

#include <Rcpp.h> 
' 

src <- ' 
    return GET_xtsIndexClass(x); 
' 

Sys.setenv("PKG_CXXFLAGS"="-I/usr/local/lib/R/site-library/xts/include") 
xtsfun <- cxxfunction(signature(x="ANY"), body=src, inc=inc, plugin="Rcpp") 

Welche kann ich laufen:

R> xtsfun <- cxxfunction(signature(x="ANY"), body=src, inc=inc, plugin="Rcpp") 
R> foo <- xts(1:5, order.by=Sys.time()+0:4) 
R> xtsfun(foo) 
[1] "POSIXct" "POSIXt" 
R> 

Flaggeneinstellabschnitt umfassen muss verallgemeinert werden, aber das ist etwas, das wir arbeiten könnten, wenn Sie auf die rcpp- überkam Entwicklungsliste.

Edit: Ich begann mit einem Add-on-Paket zu experimentieren, die Schnittstellen mit der (derzeit etwas eingeschränkteren) API von xts; siehe im Rcpp SVN Repo auf R-Forge. Ich fügte auch eine neue Antwort auf die Rcpp Gallery, die show how to access xts components aus C++ - Code. Es gibt viel bessere Möglichkeiten, um zu Attributen zu gelangen (unter Verwendung der Rcpp-API), die dann hier verwendet werden (basierend auf Rs C-API).

Bearbeiten 2: Es gibt jetzt ein neues Paket RcppXts, das dabei hilft.

+1

+1 für außerschulische Aktivität – GSee

1

Die folgende Anleitung ist für die Entwicklung von R-Paketen gedacht.

Der Schlüssel besteht darin, die erforderliche Inline-Funktion und das Makro hinzuzufügen, um xts_API mit C++ kompatibel zu machen.

extern "C" { 
#define class xts_class 
#include <xts.h> 
#undef class 
} 


inline SEXP install(const char* x) { 
    return Rf_install(x); 
} 

inline SEXP getAttrib(SEXP a, SEXP b) { 
    return Rf_getAttrib(a, b); 
} 


inline SEXP setAttrib(SEXP a, SEXP b, SEXP c) { 
    return Rf_setAttrib(a, b, c); 
} 

#include <Rcpp.h> 

RcppExport SEXP get_xts_index(SEXP x, SEXP value) { 
    BEGIN_RCPP 

    return GET_xtsIndexClass(x); 

    END_RCPP 
} 

Der obige Code sollte für fast alle xts_API außer SET_xtsIndexClass arbeiten. Der Compiler wird weiterhin error: ‘xts_IndexvalueSymbol’ was not declared in this scope melden.

Hier ist meine Lösung, aber ich weiß nicht, ob es richtig ist oder nicht.

öffnen <xts package root>/include/xts.h und ändern

#define SET_xtsIndexClass(x,value)  setAttrib(x, xts_IndexvalueSymbol, value) 

zu

#define SET_xtsIndexClass(x,value)  setAttrib(x, xts_IndexClassSymbol, value) 

Ich denke, dass es ein Tippfehler ist.