Dịch R sang C ++ (cuối cùng với Rcpp) [đã đóng]


10

Tôi muốn học cách sử dụng Rcpp . Tôi đã xem qua các tài liệu trên trang web CRAN của gói, nhưng tôi cảm thấy làm việc trên một ví dụ thực tế (thực tế thứ hai, xem xét kết hợp3) sẽ hữu ích hơn.

Tôi đề xuất mã sau đây, từ gói Strongbase vì nó không quá dài cũng không quá ngắn, sử dụng kết hợp các loại R và hàm R và có một trong những lần lặp số học nhỏ đó quá chậm trong R. Bạn sẽ đi về Rcpp như thế nào -ing nó?

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

Hãy giải thích càng nhiều càng tốt.

EDIT Đó thực sự là ý tưởng của một lời giải thích từng bước về cách bạn sẽ chuyển đổi một mã R được viết tốt (và được ghi lại) (vì vậy ít nhất là nền tảng vẫn ổn) cho đến khi thực hiện hiệu quả. Việc lựa chọn mã có thể được tranh luận một chút ngẫu nhiên nhưng tôi nghĩ rằng nó phản ánh kịch bản điển hình vòm trên bản thiết kế của chúng tôi (gọi các hàm R mà người ta không muốn dịch, sử dụng các vòng lặp số học ....).

EDIT2 từ các bình luận tôi nhận ra đây thực sự có thể là một công việc lớn phải làm trong C ++ (tôi đã không nhận ra điều đó khi đăng mã). Về vấn đề này, sử dụng các mảnh riêng lẻ làm thiết bị sư phạm là ok. Cuối cùng tôi sẽ phân tích các phần lại với nhau bằng cách chỉnh sửa câu hỏi.


3
Tôi hoàn toàn không đồng ý với tiêu đề đã chỉnh sửa của bạn và câu hỏi được thêm / chỉnh sửa. Bạn chỉ đơn giản là nhầm lẫn nếu bạn coi Rcpp là trình biên dịch mã hoặc khi yêu cầu chúng tôi viết lại mã cho bạn.
Dirk Eddelbuettel

@Dirk:> chắc chắn, một tiêu đề được đề xuất sẽ là gì (cái cũ hơn?). Tôi không thực sự quan tâm đến chức năng đặc biệt này. Tôi quan tâm đến việc học cách làm cho mã của tôi chạy nhanh hơn. Nếu bạn có một ví dụ khác, xin vui lòng gửi nó. Tôi sẽ vui vẻ đóng cái này lại.
user603

Câu trả lời:


13

Câu hỏi thú vị, nhưng hoàn toàn có thể quá khó để được thảo luận ngắn gọn:

  • Bạn sẽ cần một triển khai bên C ++ median()

  • Các mã được trích dẫn từ gói robustbase rất 'R được tối ưu hóa' có thể không phải là điểm khởi đầu tốt nhất.

  • Rcpp không phải là một 'trình biên dịch R' mà bạn ném bất kỳ chức năng nào như vậy vào để 'làm cho nó nhanh hơn'. Nó là nhiều hơn về việc kết nối mã C ++ hiện có hoặc viết mã C ++ mới.

  • Tất nhiên những điều trên có thể được dịch (Turing-tương đương và tất cả những thứ đó) nhưng đó có thể không phải là cách tốt nhất để tìm hiểu về việc sử dụng Rcpp . Tôi nghĩ rằng chúng ta có các ví dụ đơn giản hơn trong danh sách gửi thư.

Cuối cùng, đây không phải là một câu hỏi lập trình cho SO? ;-)


@Dirk:> a) có rất nhiều triển khai median () (giả sử 'pull' trong gói pcaPP) để trò chơi công bằng. b) ý bạn là người ta sẽ không nhận thấy sự gia tăng đáng kể về thời gian chạy? c) được, nhưng tôi nghĩ vấn đề với mã này không thực sự là dịch sang C ++, mà là ý tưởng gọi một số hàm R [pnorm, dnorm, ...] trong C ++ (tất nhiên tôi có thể thực sự sai) d) bạn có thể cung cấp các liên kết đến danh sách gửi thư của bạn?
user603

Chúng ta có thể vui lòng chia từng câu hỏi phụ không? A) bạn có thể gọi hàm R từ C ++ - để thuận tiện nhưng không nhất thiết phải là tốc độ. Xem các ví dụ / trong Rcpp. B) Tôi nói không có điều đó. C) Đó là tất cả dễ dàng kể từ Rcpp 0.8.7, xem tài liệu 'Rcpp sugar', bài đăng trên Rcpp-devel và các bài thuyết trình gần đây của chúng tôi. D) Nó treo trang R-forge; chỉ cần google cho 'RCpp-devel'.
Dirk Eddelbuettel

1
1) Bắt đầu tại dirk.eddelbuettel.com/presentations.html và tìm đường xuống. 2) Có sáu thư mục con cho các ví dụ / vì vậy tôi không chắc tại sao bạn tập trung vào một. 3) Có hơn 770 bài kiểm tra đơn vị tăng gấp đôi làm ví dụ nếu bạn quan tâm để xem xét kỹ. 4) Có tám (8) họa tiết trong gói Rcpp. 5) Chúng tôi đã tạo ra một vài gói khác sử dụng Rcpp, bạn cũng có thể xem xét các gói đó. 6) Cuối cùng, CRAN liệt kê mười lăm gói tùy thuộc vào Rcpp - tất cả đều là ví dụ.
Dirk Eddelbuettel

1
Dude: Có một danh sách gửi thư cho dự án mà bạn quan tâm. Tất cả các tài liệu của chúng tôi đề nghị hỏi về danh sách gửi thư. Vậy tại sao-oh-tại sao bạn cứ chồng chất ở đây? Chúng ta có thể hài lòng dừng lại mà bây giờ. Cuối cùng, 'quá hời hợt' của bạn sẽ cần một số sao lưu. Tôi sẽ vui lòng xem xét các bản vá, chỉ không đăng chúng ở đây . Đồng ý?
Dirk Eddelbuettel

2
@kwak: Trả lời "Đó là điều cần được gia công cho cộng đồng": Tôi mong được thấy những đóng góp của bạn khi bạn tự mình làm việc thông qua những ví dụ này.
Joshua Ulrich
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.