Перекласти R на C ++ (зрештою, за допомогою Rcpp) [закрито]


10

Я хотів би навчитися використовувати Rcpp . Я переглянув документи на веб-сайті CRAN пакету, але мені здається, що робота над практичним прикладом (другий практичний, враховуючи convolve3) була б більш корисною.

Я пропоную наступний код із пакета robustbase, тому що він не є занадто довгим і не занадто коротким, використовує комбінацію типів 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))
}

Поясніть, будь ласка, стільки, скільки можете.

EDIT Це дійсно ідея поетапного пояснення того, як ви хочете перетворити добре написаний (і задокументований) код R (так що, принаймні, з основами) в ефективну реалізацію. Вибір коду доводиться дещо випадковим, але я думаю, що він відображає типовий для арки сценарій на наших кресленнях (викликає функції R, які ніхто не хоче перекладати, використовує арифметичні петлі ....).

EDIT2 з коментарів, я розумію, що це насправді може бути великою справою в C ++ (я не усвідомлював цього під час публікації коду). У зв'язку з цим нормально використовувати окремі твори як педагогічні прилади. Зрештою я розберу деталі разом, відредагувавши питання.


3
Я категорично не згоден з вашим відредагованим заголовком та додав / відредагував питання. Ви просто помиляєтесь, якщо вважаєте Rcpp компілятором коду або просите нас переписати код для вас.
Дірк Еддельбюттель

@Dirk:> впевнено, яким би був запропонований заголовок (старіший?). Мені не дуже важлива ця особлива функція. Мені цікаво вивчити способи пришвидшення роботи моїх кодів. Якщо у вас є інший приклад, будь ласка, опублікуйте його. Я щасливо закрию цю.
user603

Відповіді:


13

Цікаве запитання, але, можливо, занадто складне, щоб його коротко обговорити:

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

  • Цитований код з надійної бази даних сильно «оптимізований під R», що може бути не найкращою відправною точкою.

  • Rcpp - це не "компілятор R", на який ви кидаєте будь-яку таку функцію, щоб "зробити це швидше". Йдеться більше про підключення існуючого коду C ++ або написання нового коду C ++.

  • Звичайно, вище можна перекласти (еквівалентність Тьюрінга і все таке), але це може бути не найкращим способом дізнатися про використання Rcpp . Я думаю, у нас є простіші приклади у списку розсилки.

Нарешті, це не питання програмування для SO? ;-)


@Dirk:> а) втілення медіани () (скажімо "потягніть" в пакеті pcaPP) є достатньою, так що це чесна гра. б) ви маєте на увазі, що ви не помітите значного збільшення часу роботи? в) гаразд, але я думаю, що проблема з цим кодом насправді не є перекладом на C ++, а ідеєю виклику деяких функцій R [pnorm, dnorm, ...] в C ++ (звичайно, я можу бути дійсно неправильним) d) чи можете ви надати посилання на свій список розсилки?
user603

Чи можемо ми розділити підпитання одне на одне? A) Ви можете зателефонувати на функцію R з C ++ - для зручності, але не обов'язково для швидкості. Див. Приклади / у Rcpp. Б) Я нічого такого не сказав. C) Це все просто, оскільки Rcpp 0.8.7 див. Документи "Цукор Rcpp", повідомлення в Rcpp-розробці та наші недавні презентації. Г) Він звисає зі сторінки 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: Відповідаючи на "Це щось, що слід передавати громадськості": Я з нетерпінням чекаю на ваш внесок, коли ви самі працюєте над цими прикладами.
Джошуа Ульріх
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.