Jestem absolutnym Rcpp
-begner, więc proszę was, ostrzeżcie, że wkrótce pojawi się pytanie początkującego.Jak zadeklarować wejście do funkcji Rcpp?
Rozważmy przykład:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericMatrix mat_1(NumericMatrix X){
do.stuff.with.X
}
Mi się, że definiuje funkcję mat_1
w obszarze roboczym R, które ma matrycę liczbową na wejściu i zwraca matrycę numerycznej w końcu. Jednakże looking e.g. here I rozumie, że można również określić
SEXP mat_2(SEXP X){
Rcpp::NumericMatrix x(X);
do.stuff.with.x
}
lub alternatywnie
SEXP mat_3(SEXP X){
NumericMatrix x(as<NumericMatrix>(X))
do.stuff.with.x
}
Mi się, że określa wyjście funkcji jako S-ekspresji, i wymaga S ekspresję jako wejście, które jest wewnętrznie przekonwertowane (?) na macierz numeryczną.
Teraz looking at this document, który był bardzo cennym źródłem do mnie, ja dowiedziałem się, że mogę również napisać
NumericMatrix mat_4(NumericMatrix X&){
do.stuff.with.X
}
Tutaj mój zrozumienia jest to, że zamiast tworzenia kopii X
, tym Rcpp
-function używa odwołania do obiektu R
. W rzeczywistości nie jestem pewien, czy rozumiem, co to oznacza. Czy nie było sensu używać SEXP
, że nie wykonano żadnej kopii, czy też coś złego? Ponadto, jeśli oszczędza pamięć, a zatem jest bardziej wydajny, dlaczego miałbym kiedykolwiek użyć czegoś innego?
Jestem pewien, że przegapiłem kilka opcji. W każdym razie, moje wielkie pytanie jest następujące: z punktu widzenia użytkownika R
(ja), wywołuję każdą funkcję mat_1, mat_2, mat_3
lub mat_4
dostarczając matrycę numeryczną (która jest obiektem R w moim obszarze roboczym, a zatem SEXP
), i wydaje się, że powinienem otrzymać to samo wyjście (macierz numeryczna, która będzie z perspektywy SEXP
z perspektywy R
, prawda?). Byłbym wdzięczny za wskazówki dotyczące względnych zalet tych pozornie identycznych sposobów definiowania funkcji. Oznacza to, że przy założeniu, że wiemy dokładnie, jaka funkcja będzie wejście i wyjście co będzie,
- Dlaczego i kiedy ma się opłacać używać
NumericMatrix
zamiastSEXP
dla argumentu, lub odwrotnie? - Dlaczego i kiedy używać
&
? - Jeśli wiem, że funkcja zwróci macierz numeryczną, czy istnieją powody, aby zadeklarować funkcję jako
SEXP
? Czy są powody, aby trzymać sięNumericMatrix
?
A może zupełnie nie rozumiem?
Co więcej, czy istnieje jakaś praktyczna różnica między konwersją użytą w mat_2
i mat_3
? Czy są jakieś różnice między Rcpp::NumericMatrix x(X)
i NumericMatrix x(as<NumericMatrix>(X))
?
Wszelkie uwagi są mile widziane.
Zadajesz tutaj kilka pytań, które łączą w sobie ogólne pytania dotyczące C++ ze szczegółami na temat Rcpp. SO ma wiele wspaniałych zasobów na temat tego pierwszego; wysyłamy osiem winiet z tą ostatnią, a następnie znajduje się również [książka na Rcpp] (http://www.rcpp.org/book). –
Zgadzam się. Mam jeden problem polegający na tym, że nie mogę łatwo odróżnić specyfikacji Rcpp od C++, ponieważ znam tylko C++ przez Rcpp, ale zdaję sobie sprawę, że jest to problem przy zadawaniu pytań. – coffeinjunky
Jestem świadomy winiet i książki. Są to ogromne zasoby, a przykłady na tej stronie pomogły mi zacząć, ale uważam, że książka, w szczególności, wymaga dużej wiedzy w tle, co utrudnia czytanie na konkretny temat. Jest to problematyczne, jeśli naprawdę nie wiesz, czego szukasz, co moim zdaniem jest typowym problemem dla początkujących. Jeśli jednak mógłbyś wskazać mi konkretną winietę, w której znajdę odpowiedzi na powyższe pytanie (może nawet konkretna sekcja lub słowo kluczowe, którego powinienem szukać), doceniłbym to. – coffeinjunky