5

私はいろいろと遊んでみましたが、この関数を例としてRcpp使用したいと思いますfastLm(これは、後の作業に役立つためです)。fastLmそれがパッケージの一部であることは知っていRcppArmadilloますが、を使用してコンパイルしたいと思いますsourceCpp。コードはここにあり、以下にもあります。私が遭遇する最初の問題は、インストールとロードの後に​​Rで単純に実行できないことsourceCpp("fastLm.cpp")です。私はこのエラーを受け取り、それからあらゆる種類のものを受け取ります。RcppRcppArmadilloerror: RcppArmadillo.h: No such file or directory

2番目の問題は、の一部を変更する必要があると思うことですfastLm.cpp。私の変更も以下にありますが、何かが欠けているか間違っていると確信しています。関数をRにエクスポートするためにとを含め、引数をからと#include <Rcpp.h>using namespace Rcpp;変更しました。なぜそれが機能しないのかわかりません。おそらく、戻り値に対して同様の調整が可能ですか?// [[Rcpp::export]]SEXPNumericVectorNumericMatrix

fastLm.cpp

#include <RcppArmadillo.h>

extern "C" SEXP fastLm(SEXP ys, SEXP Xs) {

    Rcpp::NumericVector yr(ys);                 // creates Rcpp vector from SEXP
    Rcpp::NumericMatrix Xr(Xs);                 // creates Rcpp matrix from SEXP
    int n = Xr.nrow(), k = Xr.ncol();

    arma::mat X(Xr.begin(), n, k, false);       // reuses memory and avoids extra copy
    arma::colvec y(yr.begin(), yr.size(), false);

    arma::colvec coef = arma::solve(X, y);      // fit model y ~ X
    arma::colvec resid = y - X*coef;            // residuals

    double sig2 = arma::as_scalar( arma::trans(resid)*resid/(n-k) );
                                                // std.error of estimate
    arma::colvec stderrest = arma::sqrt( sig2 * arma::diagvec( arma::inv(arma::trans(X)*X)) );

    return Rcpp::List::create(
        Rcpp::Named("coefficients") = coef,
        Rcpp::Named("stderr")       = stderrest
    ) ;

}

fastLm.cppが変更されました

#include <Rcpp.h>
#include <RcppArmadillo.h>
using namespace Rcpp;

// [[Rcpp::export]]
extern "C" SEXP fastLm(NumericVector yr, NumericMatrix Xr) {

    int n = Xr.nrow(), k = Xr.ncol();

    arma::mat X(Xr.begin(), n, k, false);       // reuses memory and avoids extra copy
    arma::colvec y(yr.begin(), yr.size(), false);

    arma::colvec coef = arma::solve(X, y);      // fit model y ~ X
    arma::colvec resid = y - X*coef;            // residuals

    double sig2 = arma::as_scalar( arma::trans(resid)*resid/(n-k) );
                                                // std.error of estimate
    arma::colvec stderrest = arma::sqrt( sig2 * arma::diagvec( arma::inv(arma::trans(X)*X)) );

    return Rcpp::List::create(
        Rcpp::Named("coefficients") = coef,
        Rcpp::Named("stderr")       = stderrest
    ) ;

}
4

1 に答える 1

9

疑似属性RcppArmadilloで依存関係を示す必要があります。これにより、ヘッダーRcpp::dependsの検索やリンクなどが処理され ます...RcppArmadilloblaslapack

#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]

using namespace Rcpp;

// [[Rcpp::export]]
List fastLm(NumericVector yr, NumericMatrix Xr) {

    int n = Xr.nrow(), k = Xr.ncol();

    arma::mat X(Xr.begin(), n, k, false);       // reuses memory and avoids extra copy
    arma::colvec y(yr.begin(), yr.size(), false);

    arma::colvec coef = arma::solve(X, y);      // fit model y ~ X
    arma::colvec resid = y - X*coef;            // residuals

    double sig2 = arma::as_scalar( arma::trans(resid)*resid/(n-k) );
                                                // std.error of estimate
    arma::colvec stderrest = arma::sqrt( sig2 * arma::diagvec( arma::inv(arma::trans(X)*X)) );

    return Rcpp::List::create(
        Rcpp::Named("coefficients") = coef,
        Rcpp::Named("stderr")       = stderrest
    ) ;

}

#include <RcppArmadillo.h>また、を使用するのではなく、使用することが非常に重要です#include <Rcpp.h>RcppArmadillo.hRcpp.h 適切なタイミングでインクルードを処理します。ここでは、インクルードファイルの順序が非常に重要です。

また、を返し、Listをドロップすることもできますextern "C"

于 2012-12-03T06:52:22.587 に答える