Saya ingin belajar menggunakan Rcpp . Saya membaca dokumentasi di situs web paket CRAN, tetapi saya merasa mengerjakan contoh praktis (praktis kedua, mempertimbangkan convolve3) akan lebih membantu.
Saya mengusulkan kode berikut, dari paket robustbase karena tidak terlalu panjang atau terlalu pendek, menggunakan kombinasi tipe R dan fungsi R dan memiliki salah satu iterasi aritmatika kecil yang terlalu lambat dalam R. Bagaimana Anda menjalankan Rcpp itu?
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))
}
Tolong jelaskan sebanyak mungkin.
EDIT Ini benar-benar ide penjelasan langkah demi langkah tentang bagaimana Anda akan mengubah kode R yang ditulis dengan baik (dan didokumentasikan) (jadi setidaknya yayasan tidak apa-apa) menjadi implementasi yang efisien. Pilihan kode ini bisa dibilang agak acak tetapi saya pikir itu mencerminkan skrip khas lengkung pada cetak biru kami (memanggil fungsi R yang tidak ingin diterjemahkan, menggunakan loop aritmatika ....).
EDIT2 dari komentar saya menyadari ini sebenarnya bisa menjadi pekerjaan besar untuk dilakukan di C ++ (saya tidak menyadarinya saat memposting kode). Dalam hal ini, menggunakan potongan individual sebagai perangkat pedagogis ok. Saya akhirnya akan menguraikan potongan-potongan bersama dengan mengedit pertanyaan.
Jawaban:
Pertanyaan yang menarik, tetapi sangat mungkin terlalu menantang untuk dibahas secara singkat:
Anda membutuhkan implementasi C ++ - side dari
median()
Kode yang dikutip dari paket robustbase sangat 'dioptimalkan-R' yang mungkin bukan titik awal terbaik.
Rcpp bukan 'kompiler R' tempat Anda melemparkan fungsi tersebut ke 'membuatnya lebih cepat'. Ini lebih lanjut tentang menghubungkan kode C ++ yang ada, atau menulis kode C ++ baru.
Tentu saja di atas dapat diterjemahkan (Turing-equivalence dan semua itu) tetapi itu mungkin bukan cara terbaik untuk belajar tentang menggunakan Rcpp . Saya pikir kami punya contoh sederhana di milis.
Terakhir, bukankah ini pertanyaan pemrograman untuk SO? ;-)
sumber