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.
Antworten:
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? ;-);
quelle