2013-01-11 5 views
5

xts-0.9-1パッケージによって提供されるCのxts_APIは、C++で直接使用することはできません。例えばRcppでxtsパッケージのC apiを使用する方法

、1が書く場合

#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 
} 

あり、以下のことになるのコンパイラ時エラー:

  • 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
  • Cのためにxts_APIを起動する方法
  • error: ‘xts_IndexvalueSymbol’ was not declared in this scope

答えて

5

xtsのバージョンはありますか?私にとっては、次の作品:

私は実行することができます
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") 

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> 

ザ・フラグの設定が一般化する必要がありますが、それはあなたがrcpp-に来たならば、我々は上の仕事ができるものです含めますdevelリスト。

編集:私はxtsの(現在はやや限定された)APIとインターフェイスするアドオンパッケージを試し始めました。 R-ForgeのRcpp SVNリポジトリを参照してください。また、Rcppギャラリーに新しい回答を追加しました。show how to access xts componentsはC++コードです。 Rcpp APIを使用して属性にアクセスする方法がずっとあり、ここで使用されています(RのC APIに基づいています)。

編集2:これに役立つ新しいパッケージRcppXtsがあります。

+1

+1課外活動 – GSee

1

次のガイドは、Rパッケージ開発用のガイドです。

キーは、xts_APIをC++と互換性を持たせるために必要なインライン関数とマクロを追加することです。

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 
} 

上記のコードは、SET_xtsIndexClassを除くほとんどすべてのxts_APIで有効です。

コンパイラは依然としてerror: ‘xts_IndexvalueSymbol’ was not declared in this scopeを報告します。

私の解決策ですが、それが正しいかどうかわかりません。

オープン<xts package root>/include/xts.hと私はそれはタイプミスであると推測

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

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

を変更。

関連する問題