5

xts-0.9-1 パッケージで提供される C 用の xts_API は、C++ で直接使用することはできません。

たとえば、

#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
  • error: ‘xts_IndexvalueSymbol’ was not declared in this scope

C の xts_API を呼び出す方法は?

4

2 に答える 2

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 リポジトリを参照してください。また、C++ コードからxts コンポーネントにアクセスする方法を示す Rcppギャラリーに新しい回答を追加しました。(Rcpp API を使用して) 属性を取得するより優れた方法があり、ここで (R の C API に基づいて) 使用されます。

編集 2:これに役立つ新しいパッケージRcppXtsが追加されました。

于 2013-01-11T12:32:52.737 に答える
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
}

上記のコードは、を除くほとんどすべての xts_API で機能するはずSET_xtsIndexClassです。

コンパイラは引き続きerror: ‘xts_IndexvalueSymbol’ was not declared in this scope.

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

開い<xts package root>/include/xts.hて変更する

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

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

タイプミスだと思います。

于 2013-01-11T08:07:59.580 に答える