@hadley : 안타깝게도 C ++를 시작하는 데 도움이되는 특정 리소스를 염두에 두지 않았습니다. 나는 Scott Meyers의 책 (Effective C ++, More effective C ++, etc ...)에서이 책을 집어 들었지만 실제로 입문이라고 할 수있는 것은 아닙니다.
우리는 거의 독점적으로 .Call 인터페이스를 사용하여 C ++ 코드를 호출합니다. 규칙은 충분히 쉽습니다.
- C ++ 함수는 R 개체를 반환해야합니다. 모든 R 개체는 SEXP입니다.
- C ++ 함수는 0에서 65 개 사이의 R 개체를 입력으로 사용합니다 (SEXP에서도 마찬가지 임).
- (실제로는 아니지만 나중에 저장할 수 있음) extern "C" 또는 Rcpp가 정의 하는 RcppExport 별칭을 사용 하여 C 연결로 선언 되어야합니다.
따라서 .Call 함수는 일부 헤더 파일에서 다음과 같이 선언됩니다.
#include <Rcpp.h>
RcppExport SEXP foo( SEXP x1, SEXP x2 ) ;
.cpp 파일에서 다음과 같이 구현됩니다.
SEXP foo( SEXP x1, SEXP x2 ){
...
}
Rcpp를 사용하는 R API에 대해 더 이상 알 필요가 없습니다.
대부분의 사람들은 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 기반 인덱싱을 사용하여 operator []로 수행됩니다. 예를 들어 숫자 형 벡터의 합산 값은 다음과 같습니다.
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에 의존하는 패키지에서 무엇을하는지 살펴보고, 비 네트, 단위 테스트를 확인하고 메일 링리스트를 통해 우리에게 돌아 오십시오. 항상 기꺼이 도와 드리겠습니다.