Перевести R на C ++ (в конце концов с Rcpp) [закрыто]

10

Я хотел бы научиться использовать 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 ++ (я не осознавал этого при публикации кода). В связи с этим, использование отдельных предметов в качестве педагогического устройства нормально. В конце концов, я отредактирую части, отредактировав вопрос.

user603
источник
3
Я категорически не согласен с вашим отредактированным названием и добавленным / отредактированным вопросом. Вы просто ошибаетесь, если считаете Rcpp компилятором кода или когда просите нас переписать код для вас.
Дирк Эддельбюттель
@Dirk:> конечно, какой будет предложенный заголовок (более старый?). Меня не особо волнует эта функция, я заинтересован в том, чтобы узнать, как ускорить выполнение моих кодов. Если у вас есть другой пример, пожалуйста, опубликуйте его. Я с удовольствием закрою этот.
user603 27.10.10

Ответы:

13

Интересный вопрос, но, возможно, слишком сложный, чтобы его можно было кратко обсудить:

  • Вам понадобятся реализации на C ++ - median()

  • Процитированный код из пакета robustbase высоко R-оптимизирован, что может быть не лучшей отправной точкой.

  • Rcpp не является компилятором R, в который вы бросаете любую такую ​​функцию, чтобы «сделать это быстрее». Это больше о подключении существующего кода C ++ или написании нового кода C ++.

  • Конечно, вышеприведенное можно перевести (эквивалентность по Тьюрингу и все такое), но это может быть не лучшим способом узнать об использовании Rcpp . Я думаю, у нас есть более простые примеры в списке рассылки.

Наконец, разве это не вопрос программирования для SO? ;-)

Дирк Эддельбюттель
источник
@Dirk:> а) существует множество реализаций median () (скажем, 'pull' в пакете pcaPP), так что это честная игра. б) Вы имеете в виду, что вы не заметите заметного увеличения времени работы? в) хорошо, но я думаю, что проблема с этим кодом на самом деле не в переводе на C ++, а в идее вызова некоторых функций R [pnorm, dnorm, ...] в C ++ (конечно, я могу ошибаться) d) Можете ли вы предоставить ссылку на свой список рассылки?
user603 27.10.10
Можем ли мы разделить подвопросы по одному? А) Вы можете вызывать функцию R из C ++ - для удобства, но не обязательно для скорости. Смотрите примеры / в Rcpp. Б) Я не сказал ничего подобного. C) Это очень легко, начиная с Rcpp 0.8.7, см. Документы по Rcpp sugar, публикации на Rcpp-devel и наши последние презентации. D) Он свисает со страницы R-Forge; просто Google для «rcpp-devel».
Дирк Эддельбюттель
1
1) Начните с dirk.eddelbuettel.com/presentations.html и продолжайте свой путь вниз. 2) Есть шесть подкаталогов для примеров / поэтому я не уверен, почему вы сосредоточены на одном. 3) Есть 770+ модульных тестов, которые служат примерами, если вы хотите присмотреться. 4) В пакете Rcpp восемь (8) виньеток. 5) Мы создали несколько других пакетов, использующих Rcpp, вы также можете посмотреть их. 6) Наконец, CRAN перечисляет пятнадцать пакетов в зависимости от Rcpp - все это тоже примеры.
Дирк Эддельбюттель
1
Чувак: есть список рассылки для интересующего вас проекта. Вся наша документация предлагает спросить в списке рассылки. Так почему, о-о, почему ты продолжаешь копить здесь? Можем ли мы , пожалуйста , стоп , что сейчас. Наконец, ваше «слишком поверхностное» потребует некоторой поддержки. Я с удовольствием рассмотрю патчи, просто не публикуйте их здесь . ОК?
Дирк Эддельбюттель
2
@kwak: Отвечая на вопрос «Это то, что должно быть передано сообществу»: я с нетерпением жду вашего вклада, когда вы сами будете работать с этими примерами.
Джошуа Ульрих