R'yi C ++ diline çevir (sonunda Rcpp ile) [kapalı]


10

Rcpp kullanmayı öğrenmek istiyorum . Paketin CRAN web sitesindeki dokümanlardan geçtim, ancak pratik bir örnek üzerinde çalıştığımı hissediyorum (ikinci pratik, convolve3 göz önüne alındığında) daha yararlı olacaktır.

Sağlam taban paketinden aşağıdaki kodu öneriyorum çünkü ne çok uzun ne de çok kısa, R türleri ve R işlevlerinin bir kombinasyonunu kullanıyor ve R'de çok yavaş olan bu küçük aritmetik yinelemelerden birine sahip. -ing?

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

Lütfen olabildiğince açıklayın.

EDIT Gerçekten iyi yazılmış (ve belgelenmiş) bir R kodu (böylece en azından temelleri iyi) verimli bir uygulamaya dönüştürme hakkında nasıl adım adım bir açıklama fikri. Kod seçimi biraz rastgele tartışılabilir ama ben bizim planları üzerinde kemer tipik komut dosyası yansıtır düşünüyorum (bir çevirmek istemiyor R fonksiyonları çağırır, aritmetik döngüler kullanır ....).

EDIT2 yorumlardan bu aslında C ++ (i kodu gönderirken fark etmedi) yapmak için büyük bir iş olabilir farkında. Bu bağlamda, bireysel parçaları pedagojik cihazlar olarak kullanmak tamamdır. Sonunda soruyu düzenleyerek parçaları bir araya getireceğim.


3
Ben kesinlikle katılmıyorum , düzenlenen başlık ve eklenen / düzenlenen soruyla. Rcpp'in bir kod derleyicisi olduğunu düşünüyorsanız veya kodu sizin için yeniden yazmamızı isterseniz sadece yanılıyorsunuz.
Dirk Eddelbuettel

@Dirk:> emin, önerilen bir başlık ne olurdu (eski olanı?). Kodlarımı daha hızlı çalıştırmanın yollarını öğrenmekle ilgileniyorum bu özel işlevi gerçekten umursamıyorum. Başka bir örneğiniz varsa, lütfen gönderin. Bunu mutlu bir şekilde kapatacağım.
user603

Yanıtlar:


13

İlginç bir soru, ancak kısaca tartışılması oldukça zor:

  • Bir C ++ tarafı uygulamasına ihtiyacınız olacaktır. median()

  • Robustbase paketinden alıntı yapılan kod , en iyi başlangıç ​​noktası olmayabilecek, yüksek oranda 'R optimizasyonu' yapılmıştır.

  • Rcpp , 'daha hızlı hale getirmek' için böyle bir işlevi attığınız bir 'R derleyicisi' değildir. Mevcut C ++ kodunu bağlamak veya yeni C ++ kodu yazmakla ilgilidir.

  • Elbette yukarıdakiler tercüme edilebilir (Turing-denklik ve hepsi), ancak bu Rcpp kullanımı hakkında bilgi edinmenin en iyi yolu olmayabilir . Posta listesinde daha basit örneklerimiz olduğunu düşünüyorum.

Son olarak, bu SO için bir programlama sorusu değil mi? ;-)


@Dirk:> a) bol miktarda median () uygulaması var (pcaPP paketinde 'pull' deyin) bu yüzden adil bir oyundur. b) Yani çalışma sürelerinde önemli bir artış fark edilmeyecek mi? c) tamam, ama bu kodla ilgili sorunun gerçekten C ++ çevirisi olmadığını düşünüyorum, bunun yerine C ++ 'da bazı R işlevlerini [anormal, dnorm, ...] çağırma fikri (tabii ki gerçekten yanlış olabilir) d) posta listenize link verebilir misiniz?
user603

Alt soruları tek tek ayırabilir miyiz? A) R fonksiyonunu C ++ 'dan çağırabilirsiniz - kolaylık sağlamak için ancak hız olması gerekmez. Örneklere bakın / Rcpp. B) Böyle bir şey söylemedim. C) Bu, Rcpp 0.8.7'den beri tamamen kolaydır, bkz. D) R-forge sayfasını kapatır; sadece 'rcpp-devel' için google.
Dirk Eddelbuettel

1
1) dirk.eddelbuettel.com/presentations.html adresinden başlayın ve aşağı inin. 2) Örneklerin altı alt dizini vardır / bu yüzden neden birine odaklandığınızdan emin değilim. 3) Yeterince yakından bakmayı düşünüyorsanız, örnek olarak iki katına çıkan 770+ birim testi vardır. 4) Rcpp paketinde sekiz (8) vinyet vardır. 5) Rcpp kullanan birkaç paket daha yazdık, bunlara da bakabilirsiniz. 6) Son olarak, CRAN, Rcpp'ye bağlı olarak on beş paket listeler - bunların hepsi de örnektir.
Dirk Eddelbuettel

1
Dostum: İlgilendiğiniz proje için bir posta listesi var. Tüm belgelerimiz posta listesinde sormanızı önerir. Peki neden-oh-neden burada birikmeye devam ediyorsun? Lütfen şimdi durdurabilir miyiz . Son olarak, 'çok yüzeysel' olmanız biraz destek gerektirecektir. Memnuniyetle yamaları gözden geçireceğim, sadece onları buraya göndermeyin . Tamam?
Dirk Eddelbuettel

2
@kwak: "Topluma dış kaynaklı olması gereken bir şey" yanıtını veriyor: Siz bu örnekler üzerinde çalışırken kendinize katkılarınızı görmek için sabırsızlanıyorum.
Joshua Ulrich
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.