Traduzir R para C ++ (eventualmente com Rcpp) [fechado]

10

Eu gostaria de aprender a usar o Rcpp . Analisei os documentos no site CRAN do pacote, mas acho que trabalhar em um exemplo prático (segundo prático, considerando convolve3) seria mais útil.

Eu proponho o código a seguir, do pacote robustbase porque não é muito longo nem muito curto, usa uma combinação de tipos R e funções R e possui uma dessas pequenas iterações aritméticas que são muito lentas no R. Como você abordaria o Rcpp -não?

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

Por favor, explique o máximo que puder.

EDIT É realmente a idéia de uma explicação passo a passo de como você converteria um código R bem escrito (e documentado) (para que pelo menos as bases estejam corretas) em uma implementação eficiente. A escolha do código é discutível um pouco aleatória, mas acho que reflete o script típico em nossos blueprints (chama funções R que não se deseja traduzir, usa loops aritméticos ...).

EDIT2 dos comentários eu percebo que isso pode realmente ser um grande trabalho a ser feito em C ++ (eu não percebi isso ao postar o código). Em relação a isso, não há problema em usar peças individuais como dispositivos pedagógicos. Acabarei analisando as peças editando a pergunta.

user603
fonte
3
Eu discordo com o seu título editar e adicionar / pergunta editado. Você está simplesmente enganado se considera o Rcpp um compilador de código ou quando pede para reescrever o código para você.
Dirk Eddelbuettel 27/10/10
@Dirk:> claro, qual seria um título sugerido (o mais antigo?). Realmente não me importo com essa função em particular. Estou interessado em aprender maneiras de fazer meus códigos rodarem mais rapidamente. Se você tiver outro exemplo, poste-o. Fico feliz em fechar esta.
user603

Respostas:

13

Pergunta interessante, mas possivelmente muito desafiadora para ser discutida brevemente:

  • Você precisaria de implementações do lado C ++ do median()

  • O código citado do pacote robustbase é altamente 'otimizado para R', o que pode não ser o melhor ponto de partida.

  • O Rcpp não é um 'compilador R' no qual você joga essa função para 'torná-la mais rápida'. É mais sobre como conectar o código C ++ existente ou escrever um novo código C ++.

  • Obviamente, o que foi dito acima pode ser traduzido (equivalência de Turing e tudo isso), mas essa pode não ser a melhor maneira de aprender sobre o uso do Rcpp . Eu acho que temos exemplos mais simples na lista de discussão.

Por fim, isso não é uma questão de programação para o SO? ;-)

Dirk Eddelbuettel
fonte
@Dirk:> a) há muita implementação de median () (digamos 'pull' no pacote pcaPP), portanto é um jogo justo. b) você quer dizer que não notamos um aumento considerável nos tempos de execução? c) ok, mas acho que o problema com esse código não é realmente a tradução para C ++, mas a idéia de chamar algumas funções R [pnorm, dnorm, ...] em C ++ (é claro que posso estar realmente errado) d) você pode fornecer o link para sua lista de e-mails?
user603
Podemos dividir as sub-perguntas uma a uma? A) você pode chamar a função R em C ++ - por conveniência, mas não necessariamente por velocidade. Veja os exemplos / em Rcpp. B) Eu não disse isso. C) Isso é fácil desde o Rcpp 0.8.7, consulte os documentos 'Sugar Rcpp', as postagens no Rcpp-devel e nossas apresentações recentes. D) Ele fica pendurado na página do R-forge; basta procurar no google por 'rcpp-devel'.
Dirk Eddelbuettel
11
1) Comece em dirk.eddelbuettel.com/presentations.html e desça. 2) Existem seis subdiretórios para exemplos / por isso não sei por que você se concentra em um. 3) Existem mais de 770 testes de unidade que servem de exemplo, se você quiser olhar atentamente. 4) Existem oito (8) vinhetas no pacote Rcpp. 5) Criamos alguns outros pacotes que usam o Rcpp, você pode ver também. 6) Por fim, o CRAN lista quinze pacotes, dependendo do Rcpp - todos esses são exemplos também.
Dirk Eddelbuettel 27/10/10
11
Cara: Existe uma lista de discussão para o projeto em que você está interessado. Toda a nossa documentação sugere que você pergunte na lista de discussão. Então por que-oh-por que você continua se acumulando aqui? Podemos agradar parar isso agora. Por fim, seu "muito superficial" exigiria algum backup. Terei prazer em revisar os patches, apenas não os publique aqui . OK?
Dirk Eddelbuettel
2
@kwak: Respondendo a "É algo que deve ser terceirizado para a comunidade": Estou ansioso para ver suas contribuições enquanto você trabalha com esses exemplos.
Joshua Ulrich