私はいろいろと遊んでみましたが、この関数を例としてRcpp
使用したいと思いますfastLm
(これは、後の作業に役立つためです)。fastLm
それがパッケージの一部であることは知っていRcppArmadillo
ますが、を使用してコンパイルしたいと思いますsourceCpp
。コードはここにあり、以下にもあります。私が遭遇する最初の問題は、インストールとロードの後にRで単純に実行できないことsourceCpp("fastLm.cpp")
です。私はこのエラーを受け取り、それからあらゆる種類のものを受け取ります。Rcpp
RcppArmadillo
error: RcppArmadillo.h: No such file or directory
2番目の問題は、の一部を変更する必要があると思うことですfastLm.cpp
。私の変更も以下にありますが、何かが欠けているか間違っていると確信しています。関数をRにエクスポートするためにとを含め、引数をからと#include <Rcpp.h>
にusing namespace Rcpp;
変更しました。なぜそれが機能しないのかわかりません。おそらく、戻り値に対して同様の調整が可能ですか?// [[Rcpp::export]]
SEXP
NumericVector
NumericMatrix
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
) ;
}