Код R для использования функции из файла .cpp на основе пакета Rcpp

Меня смущает использование пакета Rcpp. Каков R-код для использования R-функции newRcppVectorExample после сохранения следующего кода .cpp, говорит example.cpp? Код взят из http://dirk.eddelbuettel.com/code/rcpp.examples.html.

Мне нужно создавать пакет? Могу ли я использовать example.cpp напрямую? например R CMD SHLIB example.cpp, затем используйте функцию dyn.load.

#include <RcppClassic.h>
#include <cmath>

RcppExport SEXP newRcppVectorExample(SEXP vector) {
BEGIN_RCPP

Rcpp::NumericVector orig(vector);                          
Rcpp::NumericVector vec(orig.size());                

std::transform(orig.begin(), orig.end(), vec.begin(), ::sqrt);

return Rcpp::List::create(Rcpp::Named( "result" ) = vec,
                          Rcpp::Named( "original" ) = orig) ;

END_RCPP
}

person user1690124    schedule 22.09.2012    source источник


Ответы (1)


Вы можете потратить некоторое время на документацию, как для самого R (например, Написание расширений R) и Rcpp, где вы могли бы начать с вводной части Rcpp (которая также является нашим Статья из журнала «Статистическое программное обеспечение»).

Короче говоря, R расширяется с помощью функции .Call(), которая может получить доступ к скомпилированному коду, загруженному через пакет или через dyn.load(). Но нет смысла дублировать этот материал здесь.

Изменить: И учитывая, что вы нашли пример, который вы показываете в RcppExamples пакет, вот как он вызывается в том же пакете:

RcppVectorExample <- function(vec=seq(1,9)^2, api=c("classic", "new")) {

    api <- match.arg(api)               # match to classic or new
    fun <- paste(api, "RcppVectorExample", sep="")

    ## Make the call...
    val <- .Call(fun,                   # either new or classic
                 vec,
                 PACKAGE="RcppExamples")

    val
}

Это немного сложнее, чем обычно, потому что мы можем вызвать любой пример из старого и устаревшего API (который, тем не менее, все еще предоставляется пакет RcppClassic) или новый API (для которого вы выбрали код).

Ключ в том, что .Call() используется с первым аргументом для названной функции C ++, за которым следует набор аргументов и последний аргумент, указывающий на пакет, в котором находится разделяемая библиотека.

person Dirk Eddelbuettel    schedule 22.09.2012