Terjemahkan R ke C ++ (akhirnya dengan Rcpp) [ditutup]

10

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.

pengguna603
sumber
3
Saya sangat tidak setuju dengan judul yang diedit dan ditambah / diedit pertanyaan Anda. Anda keliru jika Anda menganggap Rcpp sebagai kompiler kode, atau ketika meminta kami untuk menulis ulang kode untuk Anda.
Dirk Eddelbuettel
@ Gang:> tentu, apa judul yang disarankan (yang lebih tua?). Saya tidak terlalu peduli dengan fungsi khusus ini. Saya tertarik mempelajari cara membuat kode saya berjalan lebih cepat. Jika Anda memiliki contoh lain, silakan kirim. Saya akan dengan senang hati menutup yang ini.
user603

Jawaban:

13

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? ;-)

Dirk Eddelbuettel
sumber
@Dirk:> a) ada banyak implementasi median () (katakanlah 'tarik' dalam paket pcaPP) jadi itu adalah permainan yang adil. b) maksudmu orang tidak akan melihat peningkatan yang cukup besar dalam waktu berjalan? c) oke, tapi saya pikir masalah dengan kode ini bukan terjemahan ke C ++, melainkan gagasan memanggil beberapa fungsi R [pnorm, dnorm, ...] di C ++ (tentu saja saya bisa salah) (d) dapatkah Anda memberikan tautan ke milis Anda?
user603
Bisakah kita memisahkan sub-pertanyaan satu per satu? A) Anda dapat memanggil fungsi R dari C ++ - untuk kenyamanan tetapi tidak harus cepat. Lihat contoh / di Rcpp. B) Saya tidak mengatakan hal seperti itu. C) Itu semua mudah sejak Rcpp 0.8.7, lihat dokumen 'Rcpp sugar', posting di Rcpp-devel dan presentasi terbaru kami. D) Menggantung halaman R-forge; cukup google untuk 'rcpp-devel'.
Dirk Eddelbuettel
1
1) Mulai di dirk.eddelbuettel.com/presentations.html dan turunkan jalan Anda. 2) Ada enam subdirektori untuk contoh / jadi saya tidak yakin mengapa Anda fokus pada satu. 3) Ada 770+ unit test yang berfungsi ganda sebagai contoh jika Anda cukup memperhatikan. 4) Ada delapan (8) sketsa dalam paket Rcpp. 5) Kami membuat beberapa paket lain yang menggunakan Rcpp, Anda bisa melihatnya juga. 6) Terakhir, CRAN mendaftar lima belas paket tergantung pada Rcpp - ini semua adalah contoh juga.
Dirk Eddelbuettel
1
Bung: Ada milis untuk proyek yang Anda minati. Semua dokumentasi kami menyarankan untuk bertanya di milis. Jadi mengapa-oh-mengapa Anda terus menumpuk di sini? Bisakah kita silahkan berhenti sekarang. Terakhir, 'terlalu dangkal' Anda akan membutuhkan cadangan. Saya dengan senang hati akan meninjau tambalan, tapi jangan mempostingnya di sini . Baik?
Dirk Eddelbuettel
2
@kwak: Menanggapi "Ini adalah sesuatu yang harus diserahkan kepada masyarakat": Saya berharap dapat melihat kontribusi Anda saat Anda mengerjakan sendiri contoh-contoh ini.
Joshua Ulrich