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.
Respostas:
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? ;-)
fonte