5

我开始Rcpp尝试并想以该fastLm函数为例(也因为它对以后的潜在工作很有用)。我知道这fastLmRcppArmadillo包的一部分,但我想使用sourceCpp. 代码可以在这里找到,也在下面。我遇到的第一个问题是sourceCpp("fastLm.cpp")在安装和加载RcppRcppArmadillo. 我得到了这个错误error: RcppArmadillo.h: No such file or directory,然后是各种各样的事情,我猜是从那开始的。

第二个问题是我认为我需要更改fastLm.cpp. 我的更改也在下面,但我确信有些东西丢失或错误。我包含#include <Rcpp.h>andusing namespace Rcpp;并将// [[Rcpp::export]]函数导出到 R 并将参数从SEXPtoNumericVectorNumericMatrix. 我不明白为什么这不起作用,并且可能对返回值进行类似的调整?

快速Lm.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伪属性指示依赖关系。这将负责查找RcppArmadillo标题和链接blaslapack...

#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.h处理包含,包含文件的顺序在这里非常重要。Rcpp.h

此外,您可以返回 aList并删除extern "C".

于 2012-12-03T06:52:22.587 回答