使用Rcpp时出现‘error: no viable overloaded =’错误,如何解决?
解决Rcpp中‘error: no viable overloaded =’错误
错误原因
调用R环境中的rmvnorm函数返回的是R的矩阵类型对象(对应C++中的SEXP类型),而你试图直接将其赋值给Armadillo的arma::colvec类型变量——两者之间没有定义直接的赋值操作符,因此触发该错误。
解决方案1:转换R返回值为Armadillo向量
先将rmvnorm的返回值存储为Rcpp矩阵类型,再转换为arma::colvec:
修改后的algorithm.cpp代码:
// [[Rcpp::depends(RcppArmadillo)]] #include <RcppArmadillo.h> #include <RcppArmadilloExtensions/sample.h> using namespace Rcpp; using namespace arma; // [[Rcpp::export]] arma::colvec algorithm() { Environment myEnv = Environment::global_env(); Rcpp::Function rmvnorm = myEnv["rmvnorm"]; int p = 3; // 接收rmvnorm返回的矩阵 NumericMatrix result_mat = rmvnorm(1, arma::zeros(p), arma::eye(p, p)); // 转换为Armadillo列向量 arma::colvec test = arma::conv_to<arma::colvec>::from(result_mat); return test; }
解决方案2:直接使用RcppArmadillo的多元正态生成函数
无需调用R的mvtnorm包,直接用Armadillo内置的mvnrnd函数生成样本,既高效又避免类型转换问题:
修改后的algorithm.cpp代码:
// [[Rcpp::depends(RcppArmadillo)]] #include <RcppArmadillo.h> #include <RcppArmadilloExtensions/sample.h> using namespace Rcpp; using namespace arma; // [[Rcpp::export]] arma::colvec algorithm() { int p = 3; arma::colvec mu = arma::zeros(p); arma::mat sigma = arma::eye(p, p); // 直接生成多元正态样本 arma::colvec test = mvnrnd(mu, sigma, 1); return test; }
关键注意事项
- 必须给C++函数添加
// [[Rcpp::export]]宏,否则R无法识别并调用该函数; - 若使用方案1,需确保R脚本中已正确加载
mvtnorm包(你的现有代码已满足这一点)。
内容的提问来源于stack exchange,提问作者Ron Snow
相关产品推荐
相关产品推荐

