Traduci R in C ++ (eventualmente con Rcpp) [chiuso]


10

Vorrei imparare a usare Rcpp . Ho esaminato i documenti sul sito Web CRAN del pacchetto, ma mi sento di lavorare su un esempio pratico (secondo pratico, considerando convolve3) sarebbe più utile.

Propongo il seguente codice, dal pacchetto robustbase perché non è né troppo lungo né troppo corto, usa una combinazione di tipi R e funzioni R e ha una di quelle piccole iterazioni aritmetiche che sono troppo lente in R. Come andresti su Rcpp -ing it?

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

Per favore, spiega il più possibile.

EDIT È davvero l'idea di una spiegazione dettagliata di come si andrebbe per convertire un codice R ben scritto (e documentato) (quindi almeno le basi vanno bene) in un'implementazione efficiente. La scelta del codice è discutibile in modo un po 'casuale, ma penso che rifletta lo script tipico dell'arco sui nostri progetti (chiama funzioni R che non si desidera tradurre, utilizza loop aritmetici ....).

EDIT2 dai commenti mi rendo conto che questo potrebbe effettivamente essere un grosso lavoro da fare in C ++ (non me ne sono reso conto quando ho pubblicato il codice). Al riguardo, va bene usare singoli pezzi come dispositivi pedagogici. Alla fine analizzerò i pezzi modificando la domanda.


3
Sono fortemente in disaccordo con il titolo modificato e la domanda aggiunta / modificata. Ti sbagli semplicemente se ritieni che Rcpp sia un compilatore di codice o quando ci chiedi di riscrivere il codice per te.
Dirk Eddelbuettel,

@Dirk:> certo, quale sarebbe un titolo suggerito (quello più vecchio?). Non mi interessa davvero questa particolare funzione, mi interessa apprendere come rendere più veloce l'esecuzione dei miei codici. Se hai un altro esempio, per favore pubblicalo. Chiuderò felicemente questo.
user603

Risposte:


13

Domanda interessante, ma probabilmente troppo impegnativa per essere discussa brevemente:

  • Avresti bisogno di implementazioni lato C ++ di median()

  • Il codice citato dal pacchetto robustbase è altamente "ottimizzato per R" che potrebbe non essere il miglior punto di partenza.

  • Rcpp non è un "compilatore R" in cui si lancia una di queste funzioni per "renderlo più veloce". Si tratta più di collegare il codice C ++ esistente o di scrivere un nuovo codice C ++.

  • Naturalmente quanto sopra può essere tradotto (equivalenza di Turing e tutto il resto) ma potrebbe non essere il modo migliore per imparare a usare Rcpp . Penso che abbiamo esempi più semplici sulla mailing list.

Infine, non è una domanda di programmazione per SO? ;-)


@Dirk:> a) ci sono molte implementazioni di median () (diciamo 'pull' nel pacchetto pcaPP) quindi è un gioco corretto. b) vuoi dire che non si noterà un notevole aumento dei tempi di esecuzione? c) va bene, ma penso che il problema con questo codice non sia proprio la traduzione in C ++, piuttosto l'idea di chiamare alcune funzioni R [pnorm, dnorm, ...] in C ++ (ovviamente posso sbagliarmi davvero) d) puoi fornire il link alla tua mailing list?
user603

Possiamo per favore dividere le domande secondarie una per una? A) puoi chiamare la funzione R da C ++ - per comodità ma non necessariamente per velocità. Vedi gli esempi / in Rcpp. B) Non ho detto niente del genere. C) Questo è tutto facile da Rcpp 0.8.7, vedere i documenti 'Rcpp sugar', i post su Rcpp-devel e le nostre recenti presentazioni. D) Si blocca sulla pagina R-forge; basta google per "rcpp-devel".
Dirk Eddelbuettel,

1
1) Inizia da dirk.eddelbuettel.com/presentations.html e procedi verso il basso. 2) Ci sono sei sottodirectory per gli esempi / quindi non sono sicuro del motivo per cui ti concentri su uno. 3) Ci sono oltre 770 unit test che raddoppiano come esempi se ti interessa guardare abbastanza da vicino. 4) Ci sono otto (8) vignette nel pacchetto Rcpp. 5) Abbiamo creato alcuni altri pacchetti che utilizzano Rcpp, è possibile esaminare anche quelli. 6) Infine, CRAN elenca quindici pacchetti a seconda di Rcpp - anche questi sono tutti esempi.
Dirk Eddelbuettel,

1
Amico: c'è una mailing list per il progetto che ti interessa. Tutta la nostra documentazione suggerisce di chiedere sulla mailing list. Quindi perché-oh-perché continui ad accumulare qui? Possiamo per favore fermarlo adesso. Infine, il tuo "troppo superficiale" richiederebbe un backup. Esaminerò volentieri le patch, ma non pubblicarle qui . Ok?
Dirk Eddelbuettel,

2
@kwak: rispondere a "È qualcosa che dovrebbe essere esternalizzato alla comunità": non vedo l'ora di vedere i tuoi contributi mentre lavori attraverso questi esempi da solo.
Joshua Ulrich,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.