@hadley: น่าเสียดายที่ฉันไม่มีแหล่งข้อมูลเฉพาะที่จะช่วยคุณในการเริ่มต้นใช้งาน C ++ ฉันหยิบมาจากหนังสือของ Scott Meyers (C ++ ที่มีประสิทธิภาพ, C ++ ที่มีประสิทธิภาพมากขึ้น ฯลฯ ... ) แต่สิ่งเหล่านี้ไม่ใช่สิ่งที่เรียกได้ว่าเป็นบทนำ
เราแทบจะใช้อินเทอร์เฟซ. Call เพื่อเรียกรหัส C ++ กฎนั้นง่ายพอ:
- ฟังก์ชัน C ++ ต้องส่งคืนวัตถุ R วัตถุ R ทั้งหมดคือ SEXP
- ฟังก์ชัน C ++ ใช้วัตถุระหว่าง 0 ถึง 65 R เป็นอินพุต (SEXP อีกครั้ง)
- มันจะต้อง (ไม่ได้จริงๆ แต่เราสามารถบันทึกนี้ได้ในภายหลัง) ได้รับการประกาศกับ C เชื่อมโยงทั้งกับ"C" externหรือRcppExportนามแฝงที่กำหนด Rcpp
ดังนั้นฟังก์ชัน. Call จึงถูกประกาศเช่นนี้ในไฟล์ส่วนหัวบางไฟล์:
#include <Rcpp.h>
RcppExport SEXP foo( SEXP x1, SEXP x2 ) ;
และดำเนินการเช่นนี้ในไฟล์. cpp:
SEXP foo( SEXP x1, SEXP x2 ){
...
}
ไม่มีอะไรอีกมากที่ต้องรู้เกี่ยวกับ R API ที่จะใช้ Rcpp
คนส่วนใหญ่ต้องการจัดการกับเวกเตอร์ตัวเลขใน Rcpp เท่านั้น คุณทำสิ่งนี้กับคลาส NumericVector มีหลายวิธีในการสร้างเวกเตอร์ตัวเลข:
จากวัตถุที่มีอยู่ที่คุณส่งต่อจาก R:
SEXP foo( SEXP x_) {
Rcpp::NumericVector x( x_ ) ;
...
}
ด้วยค่าที่กำหนดโดยใช้ฟังก์ชัน :: create static:
Rcpp::NumericVector x = Rcpp::NumericVector::create( 1.0, 2.0, 3.0 ) ;
Rcpp::NumericVector x = Rcpp::NumericVector::create(
_["a"] = 1.0,
_["b"] = 2.0,
_["c"] = 3
) ;
ขนาดที่กำหนด:
Rcpp::NumericVector x( 10 ) ; // filled with 0.0
Rcpp::NumericVector x( 10, 2.0 ) ; // filled with 2.0
จากนั้นเมื่อคุณมีเวกเตอร์สิ่งที่มีประโยชน์ที่สุดคือดึงองค์ประกอบหนึ่งออกมา สิ่งนี้ทำได้ด้วยตัวดำเนินการ [] โดยมีการจัดทำดัชนีตาม 0 ดังนั้นตัวอย่างเช่นการรวมค่าของเวกเตอร์ตัวเลขจะเป็นดังนี้:
SEXP sum( SEXP x_ ){
Rcpp::NumericVector x(x_) ;
double res = 0.0 ;
for( int i=0; i<x.size(), i++){
res += x[i] ;
}
return Rcpp::wrap( res ) ;
}
แต่ด้วยน้ำตาล Rcpp เราสามารถทำได้ดีกว่านี้มาก:
using namespace Rcpp ;
SEXP sum( SEXP x_ ){
NumericVector x(x_) ;
double res = sum( x ) ;
return wrap( res ) ;
}
อย่างที่บอกไปก่อนหน้านี้ทุกอย่างขึ้นอยู่กับประเภทของโค้ดที่คุณต้องการเขียน ดูว่าผู้คนทำอะไรในแพ็คเกจที่ต้องพึ่งพา Rcpp ตรวจสอบสะเปะสะปะการทดสอบหน่วยกลับมาหาเราในรายชื่อผู้รับจดหมาย เรายินดีให้ความช่วยเหลือเสมอ