我正在使用以下代码在 RStudio 中尝试 Rcpp/RcppArmadillo:
#include <RcppArmadillo.h>
//[[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
using std::exp;
using std::log1p;
// [[Rcpp::export]]
arma::vec log1pexp(arma::vec x) {
for(int ii = 0; ii < x.n_elem; ++ii){
if(x(ii) < 18.0){
x(ii) = log1p(exp(x(ii)));
} else{
x(ii) = x(ii) + exp(-x(ii));
}
}
return x;
}
RStudio 表示对 exp
的调用不明确。我尝试在代码中调用 std::exp
而不是 using std::exp
但没有成功。代码通过 Rcpp::sourceCpp('filename.cpp')
进行编译,不会出现警告。如果我在代码中转换 (float)x(ii)
警告就会消失,但如果
我转换了(double)x(ii)
。
感谢任何见解,我对 C++ 和 RStudio 都缺乏经验。
发生情况的图片
最佳答案
对于初学者来说,不要这样做
using namespace Rcpp;
using std::exp;
using std::log1p;
如有疑问,请明确说明。然后你的代码就变成了
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::export]]
arma::vec log1pexp(arma::vec x) {
for(size_t ii = 0; ii < x.n_elem; ++ii){
if(x(ii) < 18.0){
x(ii) = std::log1p(std::exp(x(ii)));
} else{
x(ii) = x(ii) + std::exp(-x(ii));
}
}
return x;
}
并且编译顺利(在我还将循环的 int
更改为 size_t
之后)——并且在 RStudio IDE 中没有出现问题(使用相当新的每日,1.0.116)。
有
-
标准库中的
std::exp()
,使用double
Rcpp::exp()
来自 Rcpp Sugar,使用我们的 vectorarma::exp()
来自 Armadillo 使用其 vector
而且我总是发现最简单的方式是明确的。
编辑:我错过了log1p
。使用 std::
作为前缀也需要 C++11。进行了两项更改。
关于c++ - Rcpp Armadillo : RStudio says "exp" is ambiguous,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40997722/