Я хотел бы научиться использовать Rcpp . Я просмотрел документы на веб-сайте пакета CRAN, но я чувствую, что работа над практическим примером (второй практический, учитывая convolve3) будет более полезной.
Я предлагаю следующий код из пакета robustbase , поскольку он не слишком длинный и не слишком короткий, использует комбинацию типов R и функций R и имеет одну из тех небольших арифметических итераций, которые слишком медленны в R. Как бы вы поступили с Rcpp? это?
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))
}
Пожалуйста, объясните как можно больше.
РЕДАКТИРОВАТЬ Это на самом деле идея пошагового объяснения того, как вы будете преобразовывать хорошо написанный (и документированный) R-код (так, по крайней мере, с основами в порядке) в эффективную реализацию. Выбор кода спорный немного случайный, но я думаю, что он отражает типичный для арки скрипт в наших чертежах (вызывает функции R, которые никто не хочет переводить, использует арифметические циклы ....).
EDIT2 из комментариев, я понимаю, что это может быть большая работа в C ++ (я не осознавал этого при публикации кода). В связи с этим, использование отдельных предметов в качестве педагогического устройства нормально. В конце концов, я отредактирую части, отредактировав вопрос.
Ответы:
Интересный вопрос, но, возможно, слишком сложный, чтобы его можно было кратко обсудить:
Вам понадобятся реализации на C ++ -
median()
Процитированный код из пакета robustbase высоко R-оптимизирован, что может быть не лучшей отправной точкой.
Rcpp не является компилятором R, в который вы бросаете любую такую функцию, чтобы «сделать это быстрее». Это больше о подключении существующего кода C ++ или написании нового кода C ++.
Конечно, вышеприведенное можно перевести (эквивалентность по Тьюрингу и все такое), но это может быть не лучшим способом узнать об использовании Rcpp . Я думаю, у нас есть более простые примеры в списке рассылки.
Наконец, разве это не вопрос программирования для SO? ;-)
источник