Rcpp使用记录

首先是在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。

但是由于我代码是一部分一部分重写的,所以每个函数都是Rcpp::List的输入和输出,所以充满了大量的不必要的显式转换(因为编译器报错),和隐式转换(编译器没报错,比如返回Rcpp::list使用List::create的时候直接=一个arma::vec和arma::mat)。

这块应该统一一下,比如只用Rcpp::NumericVector和NumericMatrix在一开始从R接受数据的时候,和返回的时候(隐式)。

这时候如果放弃使用Rcpp::List做黏胶把要返回的东西(例如两个矩阵),黏在一起的话,得考虑新的东西,比如用std::tuple和ties可能是一个解决方案,但是不是很确定,不过既然armadillo是从这继承的应该问题不大。

第三个坑是,还是在devtools::load_all(“.”)里面,提示

Error in getDLLRegisteredRoutines.DLLInfo(dll, addNames = FALSE) : 
  must specify DLL via a “DLLInfo” object. See getLoadedDLLs()

这个应该怎么设置?搜索一下没找到太具体的做法,改天继续试,索性一禁了之,把namespace文件里面的useDynLib(packageName, .registration=TRUE),变成useDynLib(packageName)。 但是如果按这篇文章的说法,好像不注册就不能用,不知道下面这个问题和这个有没有关系

Error in .Call("_BayesJMCM_beta_result_cpp", PACKAGE = "BayesJMCM", data,  : 
  "_BayesJMCM_beta_result_cpp" not available for .Call() for package "BayesJMCM"

但是暂时不知道咋解决,强行SourceCpp用了还行,从40s左右变成7s左右。

Avatar
Jiaming Shen
PhD candidate in statistics

My research interests include Longitudinal data anlaysis, parallel computing, MCMC methods.

comments powered by Disqus