Übersetzen Sie R nach C ++ (eventuell mit Rcpp) [geschlossen]

10

Ich würde gerne lernen, Rcpp zu benutzen . Ich habe die Dokumente auf der CRAN-Website des Pakets durchgesehen, aber ich bin der Meinung, dass die Arbeit an einem praktischen Beispiel (zweites Praktikum unter Berücksichtigung von convolve3) hilfreicher wäre.

Ich schlage den folgenden Code aus dem Robustbase- Paket vor, da er weder zu lang noch zu kurz ist, eine Kombination aus R-Typen und R-Funktionen verwendet und eine dieser kleinen arithmetischen Iterationen enthält, die in R zu langsam sind. Wie würden Sie mit Rcpp umgehen? -ing es?

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))
}

Bitte erklären Sie so viel wie möglich.

BEARBEITEN Es ist wirklich die Idee einer schrittweisen Erklärung, wie Sie einen gut geschriebenen (und dokumentierten) R-Code (zumindest die Grundlagen sind in Ordnung) in eine effiziente Implementierung konvertieren würden. Die Wahl des Codes ist ein bisschen zufällig, aber ich denke, es spiegelt das arch-typische Skript auf unseren Blaupausen wider (ruft R-Funktionen auf, die man nicht übersetzen möchte, verwendet arithmetische Schleifen ...).

EDIT2 aus den Kommentaren Ich erkenne , dass dies tatsächlich eine große Arbeit in C ++ sein kann (ich habe es nicht bemerkt, als ich den Code gepostet habe ). In diesem Zusammenhang ist es in Ordnung, einzelne Stücke als pädagogische Hilfsmittel zu verwenden. Ich werde die Teile schließlich zusammen analysieren, indem ich die Frage bearbeite.

user603
quelle
3
Ich bin mit Ihrem bearbeiteten Titel und der hinzugefügten / bearbeiteten Frage überhaupt nicht einverstanden . Sie irren sich einfach, wenn Sie Rcpp als Code-Compiler betrachten oder wenn Sie uns bitten, Code für Sie neu zu schreiben.
Dirk Eddelbuettel
@Dirk:> sicher, was wäre ein vorgeschlagener Titel (der ältere?). Diese spezielle Funktion interessiert mich nicht wirklich. Ich möchte lernen, wie meine Codes schneller ausgeführt werden können. Wenn Sie ein anderes Beispiel haben, posten Sie es bitte. Ich werde diesen gerne schließen.
user603

Antworten:

13

Interessante Frage, aber möglicherweise zu herausfordernd, um kurz diskutiert zu werden:

  • Sie benötigen eine C ++ - seitige Implementierung von median()

  • Der zitierte Code aus dem Paket robustbase ist stark "R-optimiert", was möglicherweise nicht der beste Ausgangspunkt ist.

  • Rcpp ist kein 'R-Compiler', auf den Sie eine solche Funktion werfen, um 'es schneller zu machen'. Es geht mehr darum, vorhandenen C ++ - Code zu verbinden oder neuen C ++ - Code zu schreiben.

  • Natürlich kann das Obige übersetzt werden (Turing-Äquivalenz und all das), aber das ist möglicherweise nicht der beste Weg, um etwas über die Verwendung von Rcpp zu lernen . Ich denke, wir haben einfachere Beispiele auf der Mailingliste.

Ist das nicht eine Programmierfrage für SO? ;-);

Dirk Eddelbuettel
quelle
@Dirk:> a) Es gibt viele Implementierungen von median () (sagen Sie 'pull' im Paket pcaPP), also ist es faires Spiel. b) Sie meinen, man wird keine beträchtliche Verlängerung der Laufzeiten bemerken? c) Okay, aber ich denke, das Problem mit diesem Code ist nicht wirklich die Übersetzung nach C ++, sondern die Idee, einige R-Funktionen [pnorm, dnorm, ...] in C ++ aufzurufen (natürlich kann ich mich wirklich irren). d) Können Sie den Link zu Ihrer Mailingliste bereitstellen?
user603
Können wir bitte die Unterfragen einzeln aufteilen? A) Sie können die R-Funktion von C ++ aus aufrufen - der Einfachheit halber, aber nicht unbedingt der Geschwindigkeit. Siehe die Beispiele / in Rcpp. B) Ich habe so etwas nicht gesagt. C) Das ist seit Rcpp 0.8.7 ganz einfach, siehe die 'Rcpp-Zucker'-Dokumente, Beiträge zu Rcpp-devel und unsere jüngsten Präsentationen. D) Es hängt von der R-Forge-Seite ab. google einfach nach 'rcpp-devel'.
Dirk Eddelbuettel
1
1) Beginnen Sie unter dirk.eddelbuettel.com/presentations.html und arbeiten Sie sich nach unten. 2) Es gibt sechs Unterverzeichnisse zu Beispielen / daher bin ich mir nicht sicher, warum Sie sich auf eines konzentrieren. 3) Es gibt mehr als 770 Unit-Tests, die als Beispiele dienen, wenn Sie genau genug hinschauen möchten. 4) Das Rcpp-Paket enthält acht (8) Vignetten. 5) Wir haben einige andere Pakete verfasst, die Rcpp verwenden. Sie können sich diese auch ansehen. 6) Schließlich listet CRAN je nach Rcpp fünfzehn Pakete auf - all dies sind auch Beispiele.
Dirk Eddelbuettel
1
Alter: Es gibt eine Mailingliste für das Projekt, an dem Sie interessiert sind. In unserer gesamten Dokumentation wird empfohlen, auf der Mailingliste nachzufragen. Also, warum-oh-warum stapeln Sie sich hier weiter? Können wir das jetzt bitte aufhalten? Schließlich würde Ihr "zu oberflächlich" eine gewisse Sicherung erfordern. Ich werde Patches gerne überprüfen, poste sie einfach nicht hier . OK?
Dirk Eddelbuettel
2
@kwak: Antwort auf "Es ist etwas, das an die Community ausgelagert werden sollte": Ich freue mich darauf, Ihre Beiträge zu sehen, wenn Sie diese Beispiele selbst durcharbeiten.
Joshua Ulrich