cxxfunction()を使う

  • 前の記事でinlineパッケージのcxxfunction()を使ってC++化することを書いた
  • 問題は、cxxfunction()を使えるようになること
  • 語学の勉強なので、「動く言葉」を蒐集してなんとか使えるようになればよいだろう
  • "cxxfunction"をキーワードに検索をかけてリンクを張っておけばよさそう
  • こちら
  • こちら
  • こちら
  • こちら
  • こちら
  • と、検索してリンクを張っていたら、すでにこちらの記事に戻ってきてしまった。
  • さて、練習
    • cxxfunction()の引数signature
      • 「Aという変数があって、それは"numeric"ですよ」
signature(A="numeric")
      • 本体部分関数を入れた文字列
my.body<-'
####
'
      • 本体部分関数の中身
# 引数として渡されたAをC++の数値ベクトル x とする
    NumericVector x(A);
# ベクトルxの長さ x.length()を使って、整数n出す
    int n = x.length()-1;
# 返り値用ベクトルを作る(長さを指定)
    NumericVector y(n);
# ループする 
    for (int i = 0; i < n; i++) {
        y(i)=x(i)-x(i+1);
    }
# 返すのは変数y
    return wrap(y);
      • 関数を作ろう
library(Rcpp)
library(inline)
my.body <- '
    NumericVector x(A);
    int n = x.length()-1;
    NumericVector y(n);

    for (int i = 1; i < n; i++) {
        y(i)=x(i)-x(i+1);
    }
    return wrap(y);
'

my.diff <- cxxfunction(sig=signature(A="numeric"), body=my.body, plugin="Rcpp")
      • 実行してみる
N<-100000
A<-runif(N)
my.out<-my.diff(A)
hist(my.out)

  • 遊んでみよう
    • 3次元格子のランダム・ウォーク

# 3次元格子のどの軸に進むかとその増減2方向についての2つの乱数を発生して、c++化した関数に渡す
library(Rcpp)
library(inline)
my.body <- '
    IntegerVector a(A);
    IntegerVector b(B);
    int n = a.length();
    NumericMatrix x(n,3);
    x(0,0)=0;
    x(0,1)=0;
    x(0,2)=0;
    for (int i = 1; i < n; i++) {
        x(i,0)=x(i-1,0);
        x(i,1)=x(i-1,1);
        x(i,2)=x(i-1,2);
        x(i,a[i])+=b[i];
    }
    return wrap(x);
'

my.diff <- cxxfunction(sig=signature(A="integer",B="integer"), body=my.body, plugin="Rcpp")

T<-100000
A<-sample(0:2,T,replace=TRUE)
B<-sample(c(-1,1),T,replace=TRUE)
my.out<-my.diff(A,B)

library(rgl)
T.less<-1000
# 3次元プロットは少なめの点のみで
plot3d(my.out[1:T.less,],cex=0.1)
# 全行程のプロット
plot(as.data.frame(my.out),cex=0.01)