首先是在devtools::load_all(“.”)的时候的一个坑,因为mac系统默认的clang不支持-fopenmp, 为了支持得下其他的编译器,比如llvm的clang,然后对R的设定进行修改,对电脑默认文件夹(大概是R的环境变量?)指定编译器:
CC=/usr/local/opt/llvm/bin/clang CXX=/usr/local/opt/llvm/bin/clang++ CXX11=/usr/local/opt/llvm/bin/clang++ 来自于淼大人的博客 注意这是R的环境变量里面的Makevars,也就是.R/Makevars.大概意思是你的电脑的根目录的.R下面创建一个文件,名字是Makevars,然后再用devtools::load_all(".")就不会报错了。
然后在写BayesJMCM的Rcpp版本的时候遇到的第二个坑是Rcpp::NumericVector和Rcpp::NumericMatrix到arma::vec和arma::mat之间的转换。按Dirk Eddelbuettel大人的写法是
Rcpp::NumericVector yr(ys); Rcpp::NumericMatrix Xr(XS); int n=Xr.nrow(),k=Xr,ncol(); arma::mat X(Xr.begin(),n,k,false); arma::colvec y(yr.begin(),yr.size(),false); 这个是属于armadillo语法手册中“advanced constructor”的用法,However, if copy_aux_mem is set to false, the vector will instead directly use the auxiliary memory (ie. no copying); this is faster, but can be dangerous unless you know what you are doing! ,这个false就是初始化是否copy自该内存空间,如果是false的话就不copy,直接用的是when strict is set to false, the vector will use the auxiliary memory until a size change,也就不分配额外的内存空间,达成重用原始内容,因为大概毕竟底层的结构都是std::vector。