Rcpp

一括してsourceCpp() たくさんcppファイルを作ったら

練習でたくさんのcppファイルを作ると、sourceCpp("hoge.cpp")が面倒くさくなる ので、ディレクトリの中のcppファイルのリストを作って、一括して処理 library(Rcpp) library(RcppArmadillo) sourceCpp.list <- function(files,silent=TRUE){ for(i in 1:len…

ウェブサイトの例をなぞってみる

Rcpp Galleryから Calling R Functions from C++ C++内でRの関数を使う #include <Rcpp.h> using namespace Rcpp; // [[Rcpp::export]] NumericVector callFunctionInt2Vector(int x, Function f) { NumericVector res = f(x); return res; } > sourceCpp("callFunct</rcpp.h>…

fastLmPure():RcppArmadilloを使ってみる

線形回帰 data(trees, package="datasets") fastLmPure( cbind(1, log(trees$Girth)), log(trees$Volume) ) fastLm( log(Volume) ~ log(Girth), data=trees) lm(log(trees$Volume) ~ log(trees$Girth)) > fastLmPure( cbind(1, log(trees$Girth)), log(trees…

繰り返し距離:RcppArmadilloを使ってみる

こちらのマハラノビス距離の繰り返し計算でスピードアップの様子を見てみよう cxxfunction()関数を使っている例をsourceCpp()用に書き換えてみる データ型指定はRcpp namespace形式らしい ## Using RcppArmadillo code <- 'arma::mat x = Rcpp::as<arma::mat>(X); arma:</arma::mat>…

sample():RcppArmadilloを使ってみる

Cppの線形代数ライブラリArmadillo sample()をcppにしてみよう。速くはならないけれど、cpp内での処理が可能になる "csample_char.cpp","csample_num.cpp"という関数ファイルを作って、sourceRcpp()する(参考) // [[Rcpp::depends(RcppArmadillo)]] #include <RcppArmadilloExtensions/sample.h></rcpparmadilloextensions/sample.h>…

RとC++とで関数をかき分けて練習する

No inputs, scalar output returnOneR <- function(){ return(1) } #include <Rcpp.h> // [[Rcpp::export]] int returnOneCpp(){ return(1); } int add(int, int, int); int returnOneCpp(); > sourceCpp("returnOneCpp.cpp") > returnOneCpp() [1] 1 Scalar input, </rcpp.h>…

Rcpp 0 からやりなおし

こちらのようにRtoolsの導入で躓いたのだが、まあ事なきをえたということでRtoolsが使えるので、こちらのRcpp解説記事をなぞってみます cppFunction()を使う library(Rcpp) cppFunction(' int add(int x, int y, int z) { int sum = x + y + z; return sum; …

再起動…

Rtoolsを入れるとき、以前は、パスを書き換えますか?と聞いてきたけれど、今は、デフォルトで書き換え、の模様 それで入れてみて再起動を繰り返すも、うまくいかない… 環境変数を覗いてみればちゃんと書き換わっている… 諦めてシャットダウンして翌日立ち上…

C++の関数はあるんだけど…というとき

ここ数日の記事はC(→C++)とそれを見越してのRcpp Rstudioと連携しての実行、さらにパッケージ化とかに手を染めるが、pathやらコンパイラやらで面倒多し とりあえず、Rstudioを言われた通りにいれる(こんな風に)とその上では、C++ソースをsourceCpp()で使える…

RcppのsourceCpp()とパッケージ作成

こちらの時代はRcppでのRとC++の連結では、inlineというのを使ってRのコードの中にC++対応のソースを書いて…というやり方だった RcppにsourceCpp()という関数ができて、C++で書いた関数を読み込む、というように変化していた この方が楽 それについてはここ…

Rstudioを使ってRcppする

こちらにあるように、Rの最新版(R2.15.0で始めたら対応していなかった…R3.0でやり直して成功した)で、Rtoolsを入れて、Rstudioも入れた RstudioのC/C++ファイル作成機能などを使ってやった こちらも参考 注意! // [[Rcpp::export]] はコメント行かと思った…

再帰でも速い

こちらにフィボナッチ数列の発生を再帰関数で作る実験をしている 再帰関数がどのような「遅さ」をもたらすかの実験なので、関数自体はシンプル Rでべたに書くと fibR <- function(seq) { if (seq == 0) return(0); if (seq == 1) return(1); return (fibR(se…

Rcppを使う練習:RcppでRとC++のやりとり

RcppはRでC++を使うための橋渡し援助のパッケージ そのRcppが、データや値をRの世界とC++の世界とでやりとりすすために持っている関数を使う例を示したパッケージがRcppExamples(こちら) ついでにRcppのクイック・レファレンス(こちら) 例をみよう Writing R…

Rcpp::Arrayがないので

Rcppでは行列データをC++内で作ってRのmatrixにして返すことはできるようだが、任意次元のarrayとして返す"Rcpp::Array"というものはないようだ こちら(Cで作業→Rに持ち込み、という形)で3次元の点に色を付けているが、ベクトルで返して、それをアレイに組…

Rtoolsを使ってR(cpp)を使う環境を整える

こちらでRcppを使うためにWinGWやMSYSのインストールを、と書いた あるパソコンではうまく行ったが、別のパソコンで同じ手順でやった(つもり)だが、うまく行かないので、調べものをした *ERROR(s) during compilation: source code errors or compiler con…

Deep copyしたりとか

こちらからの続き 2次元離散拡散シミュレーションができれば、かなりの用が足りる やってみる やってみる上でいくつかのひっかかりが出るので、メモしておく # 行列の世代更新 # 空を作って Rcpp::IntegerMatrix tmpx(2*n1,2*n2); # 写す std::copy(x.begin…

Rcppレファレンスサイトで使えるC/C++関数を見つける

Rcppを使って、乱数を作る話を書いた(こちら) library(Rcpp) library(inline) src<-' RNGScope z; int n=as<int>(N); double m=as<double>(M); return rexp(n, m); ' fx.rexp <- cxxfunction(signature(N="integer",M="numeric"),src,plugin="Rcpp") 上記のsrc これはC++</double></int>…

RとC++:乱数の生成2

こちらには、"3.3 Can I use code from the Rmath header and library with Rcpp ? Can I call functions defined in the Rmath header file and the standalone math library for R–as for example the random number generators?" という質問がある Rで使っ…

RNGscope()

前の記事でRNGScope()、RNGScope zを試して、それを使わないバージョンも試した fx <- cxxfunction(signature(),'RNGScope();return rnorm(5, 0, 100);',plugin="Rcpp") fx2 <- cxxfunction(signature(),'return rnorm(5, 0, 100);',plugin="Rcpp") fx3 <- c…

RとC++:乱数の生成

こちらからの続き 乱数を発生するシミュレーションをしてみる 基本は一様整数乱数を発生させるrand()と計算機の時刻からシード整数を取るsrand() rand()は規定の大きな整数を最大値とする一様整数乱数を作るので、0-1の実数一様乱数を作るには r = (double)r…

RとC++:C++のStandard Template Libraryをさらに調べる

Standard Template LibraryというのはC++の中の仕組みで、std::transformはそのうちの一つであるが、その仕組みを調べる 特に、複数の引数を与えること(複数の返り値を得ること)がどうなっているかについて情報を集める こちら

RとC++:Rの処理をそのままC++化(Standard Template Libraryでやる方法)

参考は以下のようにして出るvignett記事の"Using Standard Template Library algorithms" library(Rcpp) library(inline) vignette( "Rcpp-introduction" ) この記事の例題をなぞってみる src <- ' Rcpp::List input(data); Rcpp::Function f(fun); Rcpp::Li…

RとC++:オブジェクトの変換・対応

こちらからの続き RのオブジェクトとC++のそれの対応 R->C++がたくさんある C++->Rは(2行目の)wrap()。(これのみ?) a b c Rcpp::as() used to map SEXP to a C++ object (or proxy) Rcpp::wrap() used to map C++ object to a SEXP Rcpp::List proxy class…

cxxfunction()に慣れる

動くソースができたので、少しずつ複雑にしよう 3次元格子から任意次元格子へ library(Rcpp) library(inline) my.body2 <- ' IntegerVector a(A); IntegerVector b(B); int c=as<int>(C);; int n = a.length(); NumericMatrix x(n,c); for(int i=0;i</int>

cxxfunction()を使う

前の記事でinlineパッケージのcxxfunction()を使ってC++化することを書いた 問題は、cxxfunction()を使えるようになること 語学の勉強なので、「動く言葉」を蒐集してなんとか使えるようになればよいだろう "cxxfunction"をキーワードに検索をかけてリンクを…

RcppをWindowsで使う

RcppはRの(関数を作ったりするときに使う)パッケージでC++を使うためのパッケージ WindowsでRを使っており、ちょっと前作業も必要なので、冬休みくらいに、時間があるときに向いている こちらで書かれているように「むっちゃ速い」ということなので、試して…