แปล R เป็น C ++ (ท้ายที่สุดด้วย Rcpp) [ปิด]


10

ผมอยากจะเรียนรู้การใช้Rcpp ฉันอ่านเอกสารบนเว็บไซต์ CRAN ของแพ็คเกจ แต่ฉันรู้สึกว่าตัวอย่างที่ใช้งานได้จริง (การปฏิบัติที่สองโดยพิจารณา convolve3) จะเป็นประโยชน์มากกว่า

ฉันเสนอรหัสต่อไปนี้จากแพ็คเกจฐานที่แข็งแกร่งเพราะมันไม่ยาวเกินไปหรือสั้นเกินไปใช้การรวมกันของประเภท R และฟังก์ชั่น R และมีหนึ่งในการคำนวณเลขคณิตเล็ก ๆ เหล่านั้นที่ช้าเกินไปในอาร์คุณจะทำอย่างไรต่อ Rcpp - มัน

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

โปรดอธิบายให้มากที่สุด

แก้ไขเป็นแนวคิดของการอธิบายทีละขั้นตอนเกี่ยวกับการแปลงรหัส R (และจัดทำเป็นเอกสาร) ที่เขียนได้ดี (ดังนั้นอย่างน้อยพื้นฐานก็โอเค) ต่อการใช้งานที่มีประสิทธิภาพ ตัวเลือกของรหัสสามารถพิจารณาได้แบบสุ่ม แต่ฉันคิดว่ามันสะท้อนให้เห็นถึงสคริปต์ทั่วไปในพิมพ์เขียวของเรา (เรียกใช้ฟังก์ชั่น R ที่ไม่ต้องการแปลโดยใช้ลูปเลขคณิต .... )

EDIT2จากความคิดเห็นที่ฉันรู้ว่านี่อาจเป็นงานใหญ่ที่ต้องทำใน C ++ (ฉันไม่ทราบเมื่อโพสต์โค้ด) ในเรื่องนี้การใช้แต่ละชิ้นเป็นอุปกรณ์การสอนก็โอเค ในที่สุดฉันจะแยกวิเคราะห์ชิ้นส่วนด้วยกันโดยการแก้ไขคำถาม


3
ฉันไม่เห็นด้วยอย่างยิ่งกับชื่อที่คุณแก้ไขและคำถามที่เพิ่ม / แก้ไข คุณเข้าใจผิดถ้าคุณคิดว่า Rcpp เป็นคอมไพเลอร์โค้ดหรือเมื่อขอให้เราเขียนรหัสใหม่ให้คุณ
Dirk Eddelbuettel

@Dirk:> แน่นอนชื่อที่แนะนำจะเป็นอะไร (ชื่อเก่ากว่า) ฉันไม่สนใจเกี่ยวกับฟังก์ชั่นนี้ฉันสนใจที่จะเรียนรู้วิธีที่จะทำให้โค้ดของฉันทำงานได้เร็วขึ้น หากคุณมีตัวอย่างอื่นโปรดโพสต์ไว้ ฉันจะปิดอันนี้อย่างมีความสุข
user603

คำตอบ:


13

คำถามที่น่าสนใจ แต่อาจเป็นเรื่องที่ท้าทายเกินไปที่จะพูดคุยสั้น ๆ :

  • คุณจะต้องมีการใช้งาน C ++ ด้าน median()

  • รหัสที่อ้างถึงจากแพคเกจฐานที่แข็งแกร่งคือ 'R- optimization ' ซึ่งอาจไม่ใช่จุดเริ่มต้นที่ดีที่สุด

  • Rcppไม่ใช่ 'คอมไพเลอร์ R' ที่คุณโยนฟังก์ชั่นดังกล่าวที่ 'ทำให้เร็วขึ้น' มันเพิ่มเติมเกี่ยวกับการเชื่อมต่อรหัส C ++ ที่มีอยู่หรือการเขียนรหัส C ++ ใหม่

  • ของหลักสูตรดังกล่าวข้างต้นสามารถแปล (ทัวริง-เท่าเทียมกันและทุกอย่างแล้ว) แต่ที่ไม่อาจจะเป็นวิธีที่ดีที่สุดที่จะเรียนรู้เกี่ยวกับการใช้Rcpp ฉันคิดว่าเรามีตัวอย่างที่ง่ายกว่าในรายการส่งเมล

ท้ายสุดนี่ไม่ใช่คำถามการเขียนโปรแกรมสำหรับ SO ใช่ไหม ;-)


@ เดิร์ค:> a) มีการใช้งานมัธยฐาน () (พูดว่า 'pull' ใน package pcaPP) ดังนั้นมันจึงเป็นเกมที่ยุติธรรม b) คุณหมายถึงว่าจะไม่มีใครสังเกตเห็นการเพิ่มขึ้นอย่างมากของเวลาทำงานหรือไม่ c) โอเค แต่ฉันคิดว่าปัญหาเกี่ยวกับรหัสนี้ไม่ใช่การแปลเป็น C ++ แต่เป็นความคิดในการเรียกใช้ฟังก์ชั่น R [pnorm, dnorm, ... ] ใน C ++ (แน่นอนว่าฉันผิดจริงๆ) d) คุณสามารถให้ลิงค์ไปยังรายชื่อผู้รับจดหมายของคุณได้หรือไม่?
user603

เราสามารถแบ่งคำถามย่อยออกทีละคำถามได้ไหม? A) คุณสามารถเรียกใช้ฟังก์ชัน R จาก C ++ - เพื่อความสะดวก แต่ไม่จำเป็นต้องเพิ่มความเร็ว ดูตัวอย่าง / ใน Rcpp B) ฉันไม่ได้พูดอะไรแบบนั้น C) ง่ายมากตั้งแต่ Rcpp 0.8.7 ดูเอกสาร 'Rcpp sugar' โพสต์บน Rcpp-devel และงานนำเสนอล่าสุดของเรา D) มันออกจากหน้า R-forge; เพียง google สำหรับ 'rcpp-devel'
Dirk Eddelbuettel

1
1) เริ่มที่dirk.eddelbuettel.com/presentations.htmlและหาทางลง 2) มีหกไดเรกทอรีย่อยสำหรับตัวอย่าง / ดังนั้นฉันไม่แน่ใจว่าทำไมคุณจึงมุ่งเน้นไปที่หนึ่ง 3) มี 770+ หน่วยทดสอบที่สองเท่าเป็นตัวอย่างถ้าคุณสนใจที่จะดูอย่างใกล้ชิดพอ 4) มีแปดบทความ (8) บทความในแพ็คเกจ Rcpp 5) เราเขียนแพ็คเกจอื่น ๆ ที่ใช้ Rcpp คุณสามารถดูแพ็คเกจเหล่านั้นได้เช่นกัน 6) สุดท้าย CRAN แสดงรายการสิบห้าแพ็คเกจขึ้นอยู่กับ Rcpp - ทั้งหมดนี้เป็นตัวอย่างด้วย
Dirk Eddelbuettel

1
Dude: มีรายการส่งเมลสำหรับโครงการที่คุณสนใจเอกสารทั้งหมดของเราแนะนำให้ถามในรายการส่งจดหมาย แล้วทำไม - โอ้ - ทำไมคุณถึงยังคงซ้อนอยู่ที่นี่? เราช่วยหยุดเรื่องนี้ได้ไหม สุดท้าย 'ผิวเผินเกินไป' ของคุณจะต้องมีการสำรองข้อมูล ผมยินดีที่จะตรวจสอบแพทช์ก็ไม่ได้โพสต์ไว้ที่นี่ ตกลง?
Dirk Eddelbuettel

2
@kwak: การตอบสนองต่อ "มันเป็นสิ่งที่ควรจะเป็นแหล่งชุมชน": ฉันหวังว่าจะได้เห็นการมีส่วนร่วมของคุณในขณะที่คุณทำงานผ่านตัวอย่างเหล่านี้ด้วยตัวคุณเอง
Joshua Ulrich
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.