Rcpp Armadillo:RStudio 说“exp”不明确
Posted
技术标签:
【中文标题】Rcpp Armadillo:RStudio 说“exp”不明确【英文标题】:Rcpp Armadillo: RStudio says "exp" is ambiguous 【发布时间】:2016-12-06 14:29:09 【问题描述】:我正在使用以下代码在 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 都非常缺乏经验。
正在发生的事情的图片
【问题讨论】:
当您说 "RStudio 说" 时,您指的是 IDE 中的代码诊断消息吗?还是您遇到了实际的编译器错误? 无论如何,我建议不要使用不合格的exp
,因为(基于上述代码中的声明)这可以引用exp
std::
命名空间或@987654333 @ 来自 Rcpp::
命名空间(也可能是 C 函数 exp
来自 <math.h>
)。
谢谢@nrussell。代码编译没有错误。给出此诊断消息的是 IDE。
我无法重现这个,你使用的是哪个版本的 RStudio?
您可能应该只写下答案并将其标记为已接受,因为您拥有所有信息。只需在答案中记下您升级到的 RStudio 版本即可。
【参考方案1】:
对于初学者,不要这样做
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,使用我们的向量
arma::exp()
来自 Armadillo 使用它的向量
而且我总是觉得最容易直言不讳。
编辑:我错过了log1p
。使用 std::
为其前缀也需要 C++11。进行了两项更改。
【讨论】:
感谢您的接受。重读,我认为可能是一个IDE错误。您确实通过using
声明了std::exp
,但收到了警告。那好吧。我的“比后悔更安全”的建议仍然有效。
是的,即使在新的 IDE 版本中,它实际上又出现了。如果我在那里复制粘贴你的代码,RStudio 会说 exp 的使用再次模棱两可。我会听从您的建议并明确表示,并忽略 RStudio 消息。以上是关于Rcpp Armadillo:RStudio 说“exp”不明确的主要内容,如果未能解决你的问题,请参考以下文章
(Rcpp, armadillo) 将 arma::vec 转换为 arma::mat
在 Rcpp (Armadillo) 函数中使用数字序列作为默认参数
从 Rcpp Armadillo 中的 sp_mat 访问维度名称