Rcpp_DataFrame - アールメカブ

アールメカブ


Rcpp_DataFrame

Rの備忘録

前にも書いた気がするけど.

Rから受け取ったオブジェクトを C++ でデータフレームに返すコードだけど, Rdefines.h の場合だと以下のようになるけど,Rcpp だと,その下のようにまとまる.Namespace が厄介だけど,コードは読みやすくなって,確かに吉.

################### Rでの伝統的なインターフェイス (R.h) を使う (ちょっと余計な手順があるかもしれないけど)

  1. #include <R.h>
  2. #include <Rdefines.h>
  3. extern int utf8locale;
  4.  
  5. SEXP dfmake(SEXP x, SEXP y, SEXP z){
  6.   int pc=0;
  7.   SEXP df, varlabels, tmp, row_names;//DataTypes;
  8.  
  9.   const char* xx = CHAR(STRING_ELT(x, 0));
  10.   const char* yy = CHAR(STRING_ELT(y, 0));
  11.   const char* zz = CHAR(STRING_ELT(z, 0));
  12.  
  13.   PROTECT(df = allocVector(VECSXP, 2));// ベクトル要素を二つ持つ data.frame
  14.   pc++;
  15.  
  16.   // df内第一ベクトルは三つの要素からなる 文字ベクトル
  17.   SET_VECTOR_ELT(df, 0, allocVector(STRSXP, 3));
  18.  
  19.   SET_STRING_ELT(VECTOR_ELT(df,0), 0, mkCharCE(xx, (utf8locale)?CE_UTF8:CE_NATIVE));
  20.   SET_STRING_ELT(VECTOR_ELT(df,0), 1, mkCharCE(yy, (utf8locale)?CE_UTF8:CE_NATIVE));
  21.   SET_STRING_ELT(VECTOR_ELT(df,0), 2, mkCharCE(zz, (utf8locale)?CE_UTF8:CE_NATIVE));
  22.    
  23.   // df内第二ベクトルは三つの要素からなる 整数ベクトル
  24.   SET_VECTOR_ELT(df, 1, allocVector(INTSXP, 3));
  25.  
  26.   INTEGER(VECTOR_ELT(df,1))[0] = 10;
  27.   INTEGER(VECTOR_ELT(df,1))[1] = 20;
  28.   INTEGER(VECTOR_ELT(df,1))[2] = 30;
  29.  
  30.   PROTECT(varlabels = allocVector(STRSXP, 2));//df 内ベクトルの名前を用意
  31.   pc++;
  32.   SET_STRING_ELT(varlabels, 0, mkCharCE("Name", (utf8locale)?CE_UTF8:CE_NATIVE));
  33.   SET_STRING_ELT(varlabels, 1, mkCharCE("Age", (utf8locale)?CE_UTF8:CE_NATIVE));
  34.    
  35.   PROTECT(tmp = mkString("data.frame"));
  36.   pc++;
  37.  
  38.   PROTECT(row_names = allocVector(STRSXP, 3));
  39.   pc++;
  40.   SET_STRING_ELT(row_names, 0, mkCharCE("1", (utf8locale)?CE_UTF8:CE_NATIVE));
  41.   SET_STRING_ELT(row_names, 1, mkCharCE("2", (utf8locale)?CE_UTF8:CE_NATIVE));
  42.   SET_STRING_ELT(row_names, 2, mkCharCE("3", (utf8locale)?CE_UTF8:CE_NATIVE));
  43.        
  44.   setAttrib(df, R_ClassSymbol, tmp);
  45.   setAttrib(df, R_NamesSymbol, varlabels);
  46.   setAttrib(df, R_RowNamesSymbol, row_names);
  47.  
  48.   UNPROTECT(pc);
  49.   return(df);
  50.  
  51. }

###################

Rcpp.h を使ってデータフレームを返す

  1. #include "Rcpp.h"
  2.  
  3. using namespace Rcpp;
  4.  
  5. RcppExport SEXP dfMake2 (SEXP x, SEXP y, SEXP z){
  6.   CharacterVector cv = CharacterVector::create(as<std::string>(x),
  7.                                                as<std::string>(y),
  8.                                                as<std::string>(z));
  9.   IntegerVector nv = IntegerVector::create(10,20,30);
  10.  
  11.   return DataFrame::create(Named("Name") =  cv,  Named ("Age") =  nv,
  12.                            Named("stringsAsFactors") = false );
 
Link: R_old_tips3(1977d) Rの備忘録(4013d)
Last-modified: 2011-09-14 (水) 17:06:51 (4839d)