RcppArmadillo和arma名称空间

时间:2014-02-21 20:39:36

标签: r rcpp armadillo

开始经历R但是C ++的完全新手,我用RcppArmadillo编写了一些函数,我对它的可用性和速度非常热衷。我现在想使用函数RcppArmadillo.package.skeleton()将函数转换为包。

只要我在每个Armadillo对象(mat,colvec等)之前明确使用arma::前缀,这都可以。但是,如果我将using namespace arma;放在我的cpp文件的开头,并在之后省略arma::,我就无法加载新创建的包并获得大量错误,这些错误表明Armadillo命名空间不存在认可。

如何解决此问题的任何帮助/建议都非常感谢。谢谢,

费边

PS:我在Windows 7和Ubuntu 12.04上都尝试了上述方法,在每种情况下使用R 3.0.2和RcppArmadillo_0.4.000.4。

PS2:附加的cpp文件(松散地跟随http://gallery.rcpp.org/articles/simulate-multivariate-normal/)说明了我的观点。如果我通过sourceCpp(来自Rcpp软件包)将其源代码输入R,它可以很好地工作,但当我尝试将其包含在新软件包中时会导致上述问题。

// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
using namespace Rcpp;
using namespace arma;

// [[Rcpp::export]]
colvec mvndrawC(colvec mu, mat sig) {

double k = mu.size();
colvec aux = as<colvec>(rnorm(k));
mat csig = chol(sig).t();
colvec out = mu + csig*aux;
return(out);

}

编辑:详情

这是我执行以下操作时得到的错误输出:

  1. 运行命令RcppArmadillo.package.skeleton("test2"),从而为新包“test2”
  2. 创建文件夹
  3. 将上述代码粘贴到.cpp文件中,然后将其复制到新的test2/src文件夹
  4. 通过调用test2包中的load_all("test2")
  5. ,尝试加载新的devtools

    错误消息(在Rstudio中)

    Loading test2
    Re-compiling test2
    '/usr/lib/R/bin/R' --vanilla CMD INSTALL '/home/fabian/test2' --library='/tmp    
    /RtmplfAET0'  \
    --no-R --no-data --no-help --no-demo --no-inst --no-docs --no-exec --no-multiarch  \
    --no-test-load --preclean 
    
    * installing *source* package 'test2' ...
    ** libs
    g++ -I/usr/share/R/include -DNDEBUG   -I"/home/fabian/R/x86_64-pc-linux-gnu-library   
    /3.0/Rcpp/include" -I"/home/fabian/R/x86_64-pc-linux-gnu-library/3.0/RcppArmadillo  
    /include"  -UNDEBUG -Wall -pedantic -g -O0 -fpic  -O3 -pipe  -g  -c RcppExports.cpp -o 
    RcppExports.o
    RcppExports.cpp:10:1: error: 'colvec' does not name a type
    RcppExports.cpp: In function 'SEXPREC* test2_mvndrawC(SEXP, SEXP)':
    RcppExports.cpp:16:40: error: 'colvec' was not declared in this scope
    RcppExports.cpp:16:40: note: suggested alternative:
    /home/fabian/R/x86_64-pc-linux-gnu-library/3.0/RcppArmadillo/include/armadillo_bits   
    /typedef_mat.hpp:65:22: note:   'arma::colvec'
    RcppExports.cpp:16:47: error: template argument 1 is invalid
    RcppExports.cpp:16:55: error: expected initializer before 'mu'
    RcppExports.cpp:17:40: error: 'mat' was not declared in this scope
    RcppExports.cpp:17:40: note: suggested alternative:
    /home/fabian/R/x86_64-pc-linux-gnu-library/3.0/RcppArmadillo/include/armadillo_bits   
    /typedef_mat.hpp:63:22: note:   'arma::mat'
    RcppExports.cpp:17:44: error: template argument 1 is invalid
    RcppExports.cpp:17:52: error: expected initializer before 'sig'
    RcppExports.cpp:18:16: error: expected ';' before '__result'
    RcppExports.cpp:19:9: error: '__result' was not declared in this scope
    make: *** [RcppExports.o] Error 1
    ERROR: compilation failed for package 'test2'
    * removing '/tmp/RtmplfAET0/test2'
    Error: Command failed (1)
    In addition: Warning message:
    The following packages are referenced using Rcpp::depends attributes however are  
    not listed in the Depends and LinkingTo fields of the package DESCRIPTION file: 
    RcppArmadillo 
    

    PS3:如果我将// [[Rcpp...行放在文件的开头(但我不能通过sourceCpp来源,那么最后的警告消息就会消失,所以我让它进去了。

1 个答案:

答案 0 :(得分:4)

我相信这是因为Rcpp属性编译了你在RcppExports.cpp中创建的C ++源文件,并没有将using namespace arma;语句复制到那里。

这很棘手,因为不同的文件可能使用不同的命名空间,因此属性解析器不能只将所有using namespace ...语句复制到RcppExports.cpp - 它只是默认使用Rcpp命名空间。如果我们只是毫不犹豫地将所有using namespace语句复制到RcppExports.cpp,肯定会有冲突。

无论如何,修复要么明确地加上前缀arma::,要么您可以修改RcppExports.cpp文件以使using namespace arma;位于顶部(但每次都必须这样做在致电compileAttributes())之后。