2013-08-26 17 views
6

Bawiłem się przy tworzeniu pakietu R, który ma na celu wykorzystanie Rcpp w RStudio, ale staram się, aby rzeczy działały poprawnie z atrybutami Rcpp.Budowanie pakietów z Rcpp, Atrybuty niepoprawnie obsługiwane

Moje zrozumienia jak to działa jest dość wątpliwy, ale moje rozumienie jest następujący:

  1. w źródle C++ plików, można dodać RCPP atrybutów, na przykład znacznik // [[Rcpp::export]] wyznacza funkcję C++ dla eksportu , udostępnienie dla R.
  2. Po wykonaniu Zbuduj pakiet, Rcpp następnie generuje odpowiedni kod C++ w pliku RcppExports.cpp, a funkcje otoki w pliku źródłowym R. RcppExports.R.

Wygląda na to, że nie działa prawidłowo (jak się spodziewam), gdy buduję swoją paczkę. Roxygen nie gra z tym dobrze podczas generowania pliku NAMESPACE (więc go wyłączyłem). Znacznik // [[Rcpp::export]] wydaje się po prostu oznaczać funkcję eksportu do R, a nie oznaczać także funkcję do wyeksportowania do Przestrzeni nazw pakietów.

Co ważniejsze, znacznik Atrybut Rcpp // [[Rcpp::depends()]] nie jest obsługiwany poprawnie. Jeśli skopiuję kod here do nowego pliku źródłowego i przebuduję mój pakiet, gcc zgłasza błędy w pliku , informując, że identyfikator BigMatrix jest niezadeklarowany, co wskazuje, że atrybut // [[Rcpp::depends(bigmemory)]] nie jest obsługiwany poprawnie.

Ponieważ wiele rzeczy nie działa tak jak bym się spodziewał, Czego mi brakuje w moim rozumieniu tagów Attribute Rcpp?

+0

Możesz po prostu napisać swój interfejs funkcji ręcznie, zamiast polegać na atrybutach Rcpp i jego pomocniku "compileAttributes()". Przecież masz tu specjalny przypadek (== potrzeba specjalnego nagłówka). –

Odpowiedz

4

Jest to problem z wygenerowanym plikiem RcppExports.cpp. W tej chwili nie ma sposobu, aby nauczyć go, aby zawierał pliki nagłówkowe z innych źródeł, więc po prostu nie zawiera bigmemory/MatrixAccessor.hpp.

Rozwiązaniem jest, aby to zrobić:

#include <Rcpp.h> 
#include <bigmemory/MatrixAccessor.hpp> 

Rcpp::NumericVector BigColSums(Rcpp::XPtr<BigMatrix> pBigMat) { 

    // Create the matrix accessor so we can get at the elements of the matrix. 
    MatrixAccessor<double> ma(*pBigMat); 

    // Create the vector we'll store the column sums in. 
    Rcpp::NumericVector colSums(pBigMat->ncol()); 
    for (size_t i=0; i < pBigMat->ncol(); ++i) 
     colSums[i] = std::accumulate(ma[i], ma[i]+pBigMat->nrow(), 0.0); 
    return colSums; 
} 

// [[Rcpp::export]] 
Rcpp::NumericVector BigColSums(SEXP pBigMat){ 
    return BigColSums(Rcpp::XPtr<BigMatrix>(pBigMat)) ; 
} 

Żeby uchwycić typ w pliku .cpp i RcppExports.cpp musi tylko wiedzieć SEXP.

4

nie eksportuje funkcji do paczki NAMESPACE, po prostu mówi "powinniśmy udostępnić tę funkcję R" - to nadal zależy od tego, jak chcesz zarządzać tą funkcją w swojej przestrzeni nazw.

Roxygen pracuje w celu analizy zmiennych roxygenowych z komentarzy do plików źródłowych; będziesz musiał dołączyć znacznik //' @export do swoich plików źródłowych .cpp, jak częściowo opisano w 3.4 of the attributes vignette.

Aby uzyskać drugi problem, należy się upewnić, że bigmemory znajduje się w sekcji Depends: i pliku DESCRIPTION. Przypuszczam, że jeden może woli, aby // [[Rcpp::depends]] automatycznie modyfikować plik paczki DESCRIPTION, ale jest to łatwe do zrobienia samemu.

Podobna dyskusja odbyła się na tablicach pomocy RStudio: here.

+0

Dzięki, rozwiązałem mój problem z plikiem 'NAMESPACE' i wyjaśniłem niektóre z moich luk w wiedzy o Roxygen! Jednak dodanie '@useDynLib bigmemory' nie rozwiązuje problemu. Mam również 'bigmemory' wymienione jako zależność i łącze w pliku' DESCRIPTION'. –