RをC ++に変換します(最終的にはRcppを使用)[終了]


10

Rcppの使い方を学びたいのですが。私はパッケージのCRAN Webサイトのドキュメントを読みましたが、実用的な例(2番目の実用的な、convolve3を考慮したもの)に取り組むほうが役立つと思います。

次のコードは、長すぎたり短すぎたりせず、RタイプとR関数の組み合わせを使用し、Rで遅すぎるこれらの小さな算術反復の1つを使用しているため、robustbaseパッケージから提案します。Rcppについてどう思いますか-ingそれ?

scaleTau2<-function (x, c1 = 4.5, c2 = 3, consistency = TRUE, mu.too = FALSE){
n <- length(x)
medx <- median(x)
x. <- abs(x - medx)
sigma0 <- median(x.)
mu <- if (c1 > 0) {
    x. <- x./(sigma0 * c1)
    w <- 1 - x. * x.
    w <- ((abs(w) + w)/2)^2
    sum(x * w)/sum(w)
}
else medx
x <- (x - mu)/sigma0
rho <- x^2
rho[rho > c2^2] <- c2^2
if (!identical(consistency, FALSE)) {
    Erho <- function(b) 2*((1-b^2)*pnorm(b)-b*dnorm(b)+b^2)-1
    Es2 <- function(c2) Erho(c2*qnorm(3/4))
    nEs2 <-ifelse(consistency == "finiteSample",n-2,n)*Es2(c2)
}
else nEs2 <- n
c(if (mu.too) mu, sigma0 * sqrt(sum(rho)/nEs2))
}

できるだけ詳しく説明してください。

編集これは、適切に記述された(および文書化された)Rコードを効率的な実装に変換する方法を段階的に説明するアイデアです。コードの選択は少しランダムですが、ブループリントの典型的なスクリプトを反映していると思います(翻訳したくないR関数を呼び出し、算術ループを使用しています...)。

コメントからのEDIT2私はこれが実際にはC ++で行うには大きな作業である可能性があることを認識しています(コードを投稿するときにそれを認識していませんでした)。これに関しては、個々の部分を教育的装置として使用することは問題ありません。質問を編集して、最終的にピースを一緒に解析します。


3
編集したタイトルおよび追加/編集した質問に強く同意ません。Rcppをコードコンパイラと見なす場合、またはコードを書き換えるように依頼された場合は、単に誤解されます。
Dirk Eddelbuettel、

@Dirk:>確かに、推奨されるタイトルは何ですか(古いタイトルですか?)。私は、コードをより高速に実行する方法を学習することに興味があるこの特定の関数については本当に気にしません。別の例がある場合は、投稿してください。私はこれを喜んで閉じます。
user603

回答:


13

興味深い質問ですが、簡単に説明するには難しすぎるかもしれません。

  • C ++側の実装が必要になります median()

  • パッケージrobustbaseから引用されたコードは、非常に「R最適化」されているため、最適な出発点ではない可能性があります。

  • Rcppは「Rコンパイラ」ではなく、「高速化」するためにそのような関数を投げます。それは、既存のC ++コードを接続するか、新しいC ++コードを作成することについてです。

  • もちろん、上記は翻訳可能です(チューリング等価などすべて)。しかし、それはRcppの使い方を学ぶ最良の方法ではないかもしれません。メーリングリストにはもっと簡単な例があると思います。

最後に、これはSOのプログラミングの質問ではないですか?;-)


@Dirk:> a)median()(パッケージpcaPPで「プル」など)の実装がたくさんあるので、公平なゲームです。b)実行時間の大幅な増加に気付かないということですか?c)わかりましたが、このコードの問題は実際にはC ++への変換ではなく、C ++でいくつかのR関数[pnorm、dnorm、...]を呼び出すという考えです(もちろん、私は本当に間違っている可能性があります)d)メーリングリストへのリンクを提供できますか?
user603

サブ質問を1つずつ分割できますか?A)C ++からR関数を呼び出すことができます-便宜上、必ずしも速度ではありません。Rcppのexamples /を参照してください。B)そのようなことは言わなかった。C)Rcpp 0.8.7以降は簡単です。「Rcpp sugar」のドキュメント、Rcpp-develへの投稿、および最近のプレゼンテーションを参照してください。D)R-forgeページからハングアップします。「rcpp-devel」をググるだけ。
Dirk Eddelbuettel、

1
1)dirk.eddelbuettel.com/presentations.htmlから開始して、作業を進めます。2)examples /には6つのサブディレクトリがあるので、なぜそれに集中するのかわかりません。3)十分に注意深く見たい場合は、例を兼ねた770以上の単体テストがあります。4)Rcppパッケージには8つのビネットがあります。5)Rcppを使用する他のいくつかのパッケージを作成しました。これらも確認できます。6)最後に、CRANはRcppに応じて15個のパッケージをリストします。これらもすべて例です。
Dirk Eddelbuettel、

1
おい:あなたが興味を持っているプロジェクトのためのメーリングリストがあります。私たちのすべてのドキュメントはメーリングリストで尋ねることを提案しています。では、なぜ、なぜここに積み重ね続けるのですか?私たちはすることができます喜ば今ことを停止します。最後に、「表面的すぎる」場合は、ある程度のバックアップが必要になります。私は喜んでパッチをレビューしますが、ここに投稿しないでください。OK?
Dirk Eddelbuettel、

2
@kwak:「コミュニティにアウトソーシングする必要のあるものです」への対応:これらの例を自分で処理する際の貢献を楽しみにしています。
Joshua Ulrich
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.