我开始Rcpp
尝试并想以该fastLm
函数为例(也因为它对以后的潜在工作很有用)。我知道这fastLm
是RcppArmadillo
包的一部分,但我想使用sourceCpp
. 代码可以在这里找到,也在下面。我遇到的第一个问题是sourceCpp("fastLm.cpp")
在安装和加载Rcpp
和RcppArmadillo
. 我得到了这个错误error: RcppArmadillo.h: No such file or directory
,然后是各种各样的事情,我猜是从那开始的。
第二个问题是我认为我需要更改fastLm.cpp
. 我的更改也在下面,但我确信有些东西丢失或错误。我包含#include <Rcpp.h>
andusing namespace Rcpp;
并将// [[Rcpp::export]]
函数导出到 R 并将参数从SEXP
toNumericVector
和NumericMatrix
. 我不明白为什么这不起作用,并且可能对返回值进行类似的调整?
快速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
) ;
}