使用Rstudio在Windows中设置Rcpp Armadillo

时间:2014-05-19 15:31:25

标签: windows r rcpp armadillo

我正在尝试使用Rstudio在我的Windows系统中设置RcppArmadillo。我已使用命令

成功安装了RcppArmadillo
install.packages("RcppArmadillo")

在R控制台中。

但是当我尝试使用RcppArmadillo依赖编译c ++代码时,我得到一个错误,如

g++ -m64 -I"C:/PROGRA~1/R/R-30~1.3/include" -DNDEBUG     -I"C:/PROGRA~1/R/R-30~1.3/library/Rcpp/include"  -I"d:/RCompile/CRANpkg/extralibs64/local/include"     -O2 -Wall  -mtune=core2 -c colrowStat.cpp -o colrowStat.o colrowStat.cpp:5:26: fatal error: RcppArmadillo.h: No such file or directory compilation terminated. make: *** [colrowStat.o] Error 1 Warning message: running command 'make -f "C:/PROGRA~1/R/R-30~1.3/etc/x64/Makeconf" -f "C:/PROGRA~1/R/R-30~1.3/share/make/winshlib.mk" SHLIB_LDFLAGS='$(SHLIB_CXXLDFLAGS)' SHLIB_LD='$(SHLIB_CXXLD)' SHLIB="sourceCpp_38187.dll" WIN=64 TCLBIN=64 OBJECTS="colrowStat.o"' had status 2 

但是头文件可以在path_to_my_documents / R / win-libraries / 3.0 / RcppArmadillo / Include中找到

我认为编译的包含路径不具备此路径。我不知道如何将此文件夹添加到路径中。我非常感谢对这个问题的任何帮助。

2 个答案:

答案 0 :(得分:3)

你做错了。有很多方法可以做到,我们记录了其中几个。你在这里做的不是其中之一。

试试这个并从那里开始:

R> library(Rcpp)
R> cppFunction("arma::mat op(arma::vec x) { return(x*x.t()); }", 
+              depends="RcppArmadillo")
R> op(1:2)
     [,1] [,2]
[1,]    1    2
[2,]    2    4
R> 

这是一个基本的例子:取一个向量,乘以它的转置并返回结果外积矩阵。

你最终想要的是一个包,为此你可以做得比从RcppArmadillo.package.skeleton()开始更糟糕。

答案 1 :(得分:0)

您的问题是细节问题,但如果您使用的是Windows计算机并且正在使用RStudio,那么这里是一个完全可重现的示例,说明如何在不使用RcppArmadillo包的情况下使用inline除了很短的功能外,它并不理想 正如Dirk所指出的那样,这个建议可以在其他地方获得--Rcpp *生态系统的记录很奇怪,但这可能对新手有帮助。

0。预赛:

您应该安装以下内容:

  1. Rtools
  2. R package devtools
  3. R package Rcpp
  4. R package RcppArmadillo
  5. 1。 C ++代码:

    该示例是计算线性回归模型的OLS估计器的简单示例。以下是C ++文件,其中一个函数(fnLinRegRcpp)将设计矩阵作为输入并生成OLS系数估计值,模型残差为Rcpp List,如下所示:

    // LinearRegression.cpp
    // [[Rcpp::depends(RcppArmadillo)]]
    #include <RcppArmadillo.h>
    using namespace arma;  // use the Armadillo library for matrix computations
    using namespace Rcpp;
    
    // [[Rcpp::export]]
    List fnLinRegRcpp(vec vY, mat mX) {
    
      // compute the OLS estimator & model residuals
      vec vBeta =  solve(mX.t()*mX, mX.t()*vY);  
      vec vResid = vY - mX * vBeta;
    
      // construct the return object
      List ret;
      ret["beta"] = vBeta;
      ret["resid"] = vResid;
    
      return ret;
    }
    
    // END
    

    请注意使用Rcpp attributes

    // [[Rcpp::depends(RcppArmadillo)]]
    

    表示Armadillo库的库依赖项。

    2。 R代码

    以下是使用sourceCpp函数编译C ++代码的示例,以及函数使用示例,以及输出与内置lm.fit的比较功能

    # LinearRegression.R
    library(devtools)
    library(Rcpp)
    library(RcppArmadillo)
    
    Rcpp::sourceCpp("code/LinearRegression.cpp", 
                    showOutput = TRUE, 
                    rebuild = FALSE)
    
    # generate some sample data
    iK = 4
    iN = 100
    mX = cbind(1, matrix(rnorm(iK*iN), iN, iK))
    vBeta0 = c(2, 3.5, 0.11, 6.33, 23)
    vY = rnorm(iN, mean = mX %*% vBeta0)
    
    # test the function
    linReg1 = fnLinRegRcpp(vY, mX)
    linReg1$beta  # coefficient estimates
    
    # compare the results to the built-in lm.fit function
    lm.fit(y = vY, x = mX)$coef  # coefficient estimates
    
    # END