@hadley: Maalesef, C ++ kullanmaya başlamanıza yardımcı olacak belirli kaynaklarım yok. Bunu Scott Meyers'in kitaplarından aldım (Etkili C ++, Daha Etkili C ++, vb.) Ama bunlar gerçekten giriş olarak adlandırılabilecek şeyler değil.
C ++ kodunu çağırmak için neredeyse yalnızca .Call arayüzünü kullanıyoruz. Kural yeterince kolaydır:
- C ++ işlevi bir R nesnesi döndürmelidir. Tüm R nesneleri SEXP'dir.
- C ++ işlevi girdi olarak 0 ila 65 R nesnesi alır (yine SEXP)
- (gerçekten değil, ama bunu daha sonrası için kaydedebiliriz) ya extern "C" veya Rcpp'nin tanımladığı RcppExport takma adı ile C bağlantısı ile bildirilmelidir .
Yani bir .Call işlevi bazı başlık dosyasında şu şekilde bildirilir:
#include <Rcpp.h>
RcppExport SEXP foo( SEXP x1, SEXP x2 ) ;
ve bir .cpp dosyasında şu şekilde uygulandı:
SEXP foo( SEXP x1, SEXP x2 ){
...
}
Rcpp kullanmak için R API hakkında bilinmesi gereken çok şey yok.
Çoğu insan sadece Rcpp'de sayısal vektörlerle uğraşmak ister. Bunu NumericVector sınıfıyla yaparsınız. Sayısal bir vektör oluşturmanın birkaç yolu vardır:
R'den aktardığınız mevcut bir nesneden:
SEXP foo( SEXP x_) {
Rcpp::NumericVector x( x_ ) ;
...
}
:: create static işlevini kullanarak verilen değerlerle:
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
) ;
Belirli bir boyutta:
Rcpp::NumericVector x( 10 ) ; // filled with 0.0
Rcpp::NumericVector x( 10, 2.0 ) ; // filled with 2.0
Sonra bir vektöre sahip olduğunuzda, en kullanışlı şey ondan bir element çıkarmaktır. Bu, 0 tabanlı indekslemeyle [] operatörüyle yapılır, bu nedenle örneğin bir sayısal vektörün değerlerinin toplanması şu şekilde olur:
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 ) ;
}
Ancak Rcpp şeker ile bunu şimdi çok daha güzel bir şekilde yapabiliriz:
using namespace Rcpp ;
SEXP sum( SEXP x_ ){
NumericVector x(x_) ;
double res = sum( x ) ;
return wrap( res ) ;
}
Daha önce de söylediğim gibi, her şey ne tür bir kod yazmak istediğinize bağlı. İnsanların Rcpp'ye dayanan paketlerde ne yaptığına bakın, vinyetleri kontrol edin, birim testleri, posta listesinde bize geri dönün. Yardımcı olmaktan her zaman mutluluk duyarız.