Przetłumacz R na C ++ (ewentualnie z Rcpp) [zamknięte]

10

Chciałbym nauczyć się korzystać z Rcpp . Przejrzałem dokumenty na stronie CRAN pakietu, ale wydaje mi się, że praca nad praktycznym przykładem (drugi praktyczny, biorąc pod uwagę convolve3) byłaby bardziej pomocna.

Proponuję następujący kod z pakietu robustbase , ponieważ nie jest ani za długi, ani za krótki, wykorzystuje kombinację typów R i funkcji R oraz ma jedną z tych małych iteracji arytmetycznych, które są zbyt wolne w R. Jak byś poszedł o Rcpp -Czy to?

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

Wyjaśnij jak najwięcej.

EDYCJA Naprawdę chodzi o krok po kroku wyjaśnienie, w jaki sposób zająłbyś się konwertowaniem dobrze napisanego (i udokumentowanego) kodu R (co najmniej podstawy są w porządku) na wydajną implementację. Wybór kodu jest nieco przypadkowy, ale myślę, że odzwierciedla on typowy dla naszych skryptów skrypt (wywołuje funkcje R, których nie chce się tłumaczyć, używa pętli arytmetycznych ....).

EDIT2 z komentarzy zdaję sobie sprawę, że może to być naprawdę duża praca w C ++ (nie zdawałem sobie z tego sprawy podczas publikowania kodu). W związku z tym stosowanie poszczególnych utworów jako narzędzi pedagogicznych jest w porządku. W końcu przeanalizuję wszystkie elementy, edytując pytanie.

użytkownik603
źródło
3
I zgadzam się z edytowanych tytułów i dodawane / edytowane pytanie. Po prostu się mylisz, jeśli uważasz Rcpp za kompilator kodu lub gdy prosisz nas o przepisanie kodu.
Dirk Eddelbuettel
@Dirk:> jasne, jaki byłby sugerowany tytuł (starszy?). Tak naprawdę nie dbam o tę konkretną funkcję. Jestem zainteresowany nauką sposobów, aby moje kody działały szybciej. Jeśli masz inny przykład, opublikuj go. Z przyjemnością go zamknę.
user603

Odpowiedzi:

13

Interesujące pytanie, ale być może zbyt trudne, aby je krótko omówić:

  • Potrzebne byłyby implementacje po stronie C ++ median()

  • Cytowany kod z pakietu robustbase jest wysoce „zoptymalizowany pod kątem R”, co może nie być najlepszym punktem wyjścia.

  • Rcpp nie jest „kompilatorem R”, w którym rzucasz dowolną taką funkcję, aby „przyspieszyć”. Chodzi raczej o podłączenie istniejącego kodu C ++ lub pisanie nowego kodu C ++.

  • Oczywiście powyższe można przetłumaczyć (równoważność Turinga i tak dalej), ale nie może to być najlepszy sposób na naukę korzystania z Rcpp . Myślę, że mamy prostsze przykłady na liście mailingowej.

Wreszcie, czy nie jest to pytanie programistyczne dla SO? ;-)

Dirk Eddelbuettel
źródło
@Dirk:> a) jest wiele implementacji median () (powiedz „pull” w pakiecie pcaPP), więc jest to uczciwa gra. b) masz na myśli, że nie zauważysz znacznego wzrostu czasu pracy? c) okej, ale myślę, że problemem z tym kodem nie jest tak naprawdę tłumaczenie na C ++, a raczej pomysł wywołania niektórych funkcji R [pnorm, dnorm, ...] w C ++ (oczywiście mogę się naprawdę mylić) d) czy możesz podać link do swojej listy mailingowej?
user603
Czy możemy podzielić pytania cząstkowe jeden po drugim? A) możesz wywołać funkcję R z C ++ - dla wygody, ale niekoniecznie szybkości. Zobacz przykłady / w Rcpp. B) Nie powiedziałem nic takiego. C) To wszystko jest łatwe, odkąd Rcpp 0.8.7, zobacz dokumenty „Rcpp sugar”, posty na Rcpp-devel i nasze ostatnie prezentacje. D) Wisi na stronie R-forge; po prostu google dla „rcpp-devel”.
Dirk Eddelbuettel
1
1) Zacznij od dirk.eddelbuettel.com/presentations.html i zejdź na dół. 2) Istnieje sześć podkatalogów przykładów / więc nie jestem pewien, dlaczego się na nich skupiasz. 3) Istnieje ponad 770 testów jednostkowych, które podwajają się jako przykłady, jeśli chcesz wystarczająco uważnie się przyjrzeć. 4) W pakiecie Rcpp znajduje się osiem (8) winiet. 5) Stworzyliśmy kilka innych pakietów korzystających z Rcpp, możesz też na nie spojrzeć. 6) Na koniec CRAN wyświetla piętnaście pakietów w zależności od Rcpp - wszystkie one również są przykładami.
Dirk Eddelbuettel
1
Koleś: Istnieje lista mailingowa dla projektu, którym jesteś zainteresowany. Cała nasza dokumentacja sugeruje, aby zapytać na liście mailingowej. Więc dlaczego-och-dlaczego ciągle się tutaj palujesz? Możemy zadowolić przystanek to teraz. Wreszcie, twoje „zbyt powierzchowne” wymagałoby trochę kopii zapasowej. Z przyjemnością przejrzę łatki, nie publikuj ich tutaj . Ok?
Dirk Eddelbuettel
2
@kwak: Odpowiadając na „To coś, co powinno zostać zlecone społeczności”: Z niecierpliwością czekam na Twój wkład w samodzielne opracowanie tych przykładów.
Joshua Ulrich