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 来自 &lt;math.h&gt;)。 谢谢@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 访问维度名称

如何通过在 Rcpp 或 Armadillo 中将矩阵乘以向量元素来复制 R 的功能?

如何在Rstudio中调用Rcpp向量的对数函数

Parallel 和 Rcpp Armadillo 的问题:集群工作人员之间可能存在变量损坏