Rcpp のバックアップ差分(No.3) - アールメカブ

アールメカブ


Rcpp のバックアップ差分(No.3)


  • 追加された行はこの色です。
  • 削除された行はこの色です。
[[Rの備忘録]]

[[dirk.eddelbuettel Rcpp:http://dirk.eddelbuettel.com/code/rcpp.html]]

#contents

* DataFrame 作成 [#x092ad8e]

 #include "Rcpp.h"
 RcppExport SEXP testDF (){
 
  Rcpp::IntegerVector v = Rcpp::IntegerVector::create(1,2,3);
  std::vector<std::string> str(3);
     str[0] = "A"; str[1] = "B"; str[2] = "C";
     return Rcpp::DataFrame::create(Rcpp::Named("Var1", v), 
                  Rcpp::Named ("Var2", s),
                  Rcpp::Named("stringsAsFactors", false )); 
 // あるいは 
      return Rcpp::DataFrame::create(Rcpp::Named("VAR1") =  v,
                  Rcpp::Named ("VAR2") =  s,  
                  Rcpp::Named("stringsAsFactors") = false ); 	 
 }

* CharacterVector [#pa7dd8c1]

 RcppExport SEXP testChar (SEXP a, SEXP b){
   Rcpp::CharacterVector xa (a);
   Rcpp::CharacterVector xb (b);
ここで以下はコンパイラを通らない
 std::string sxa = xa[0];
以下のようにしないと行けない
   std::string sxa;
   sxa = xa[0];
   std::string sxb;
   sxb = xb[0]; 

* rcpp のサンプル [#xada24e9]

Windows 7(64bit) 上の R-2.12.0 環境で,Rcpp_sample.cpp を以下のMakevars を用意.

 PKG_CXXFLAGS=$(shell Rscript -e "Rcpp:::CxxFlags()")
 PKG_LIBS=$(shell Rscript -e "Rcpp:::LdFlags()")

してコマンドプロンプトから素直に 

 R CMD SHLIB Rcpp_sample.cpp
    http://cygwin.com/cygwin-ug-net/using.html#using-pathnames
 g++ -shared -s -static-libgcc -o  Rcpp_sample.dll tmp.def 
   Rcpp_sample.cpp C:/Users/ishida/Documents/R/win-library/2.12/Rcpp/lib/i386/libRcpp.a
 -LC:/PROGRA~1/R/R-212~1.0/bin/i386 -lR

とすると i386 が呼ばれる.確かに

 Rscript -e "Rcpp:::LdFlags()
 C:/Users/ishida/Documents/R/win-library/2.12/Rcpp/lib/i386/libRcpp.a

となっている.が,こっちを呼んで欲しい

 Rscript --arch x64 -e "Rcpp:::LdFlags()
 C:/Users/ishida/Documents/R/win-library/2.12/Rcpp/lib/x64/libRcpp.a

やむなく

 PKG_LIBS = C:/Users/ishida/Documents/R/win-library/2.12/Rcpp/lib/x64/libRcpp.a 

あるいは

 PKG_LIBS = -LC:/Users/ishida/Documents/R/win-library/2.12/Rcpp/lib/x64/ -lRcpp

と修正し

 R --arch x64 CMD SHLIB Rcpp_sample.cpp

と実行.

 dyn.load("Rcpp_sample.dll")