2017-10-09 54 views
1

我写如下一个RCPP代码:RCPP警告:呼吁 'EXP' 不明确

// [[Rcpp::depends(RcppArmadillo)]] 
// [[Rcpp::depends(BH)]] 
// [[Rcpp::plugins(cpp11)]] 

#include <RcppArmadillo.h> 
#include <boost/random.hpp> 
#include <boost/random/uniform_real_distribution.hpp> 
#include <math.h> 

using namespace Rcpp; 
using namespace std; 

// [[Rcpp::export]] 

double ks(const double k, const double alpha, const double mag, const double M0){ 
    double ksres; 
    ksres= k* std::exp (alpha*(mag-M0)); 
    return(ksres); 
    } 

但它表明“调用'exp'是不明确的”。为什么我会收到这条消息,我将如何解决?

虽然我得到了sessionInfo():

 R version 3.2.4 (2016-03-10) 
     Platform: x86_64-apple-darwin13.4.0 (64-bit) 
     Running under: OS X 10.12.6 (unknown) 

locale: 
[1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] Rcpp_0.12.4 

loaded via a namespace (and not attached): 
[1] colorspace_1.2-6 scales_0.4.0  plyr_1.8.3  tools_3.2.4  inline_0.3.14 gtable_0.2.0  rstan_2.9.0-3 
[8] gridExtra_2.2.1 ggplot2_2.1.0 grid_3.2.4  munsell_0.4.3 stats4_3.2.4 
+1

我不能重现这一点。它编译没有错误。请提供更多关于您的系统的信息,例如'sessionInfo()'。 – Roland

+1

为什么包含“cmath”和“math.h”?特别是随后使用“命名空间标准”。 – teivaz

+0

@Roland请参阅编辑 – gultu

回答

2

我的建议是要被关闭或删除OP。现在的问题只是表现出了一些允许的但不推荐C++用法:

  • 额外的头包括:数学头已经RCPP(由RcppArmadillo带来的)带来了
  • 你永远需要cmathmath.h,和这里说你不需要任何
  • 我们一般建议不要压扁的所有命名空间无条件

有了这个,你的代码看起来像这样(仍然包含C++ 11不使用电话,但也没有坏处):

// [[Rcpp::depends(RcppArmadillo)]] 
// [[Rcpp::depends(BH)]] 
// [[Rcpp::plugins(cpp11)]] 

#include <RcppArmadillo.h> 
#include <boost/random.hpp> 
#include <boost/random/uniform_real_distribution.hpp> 

// [[Rcpp::export]] 
double ks(const double k, const double alpha, const double mag, const double M0){ 
    double ksres; 
    ksres= k* std::exp (alpha*(mag-M0)); 
    return(ksres); 
} 

/*** R 
ks(1.0, 2.0, 3.0, 4.0) 
*/ 

这编译没有在我的箱子不得以任何警告(严格编译器警告打开,输出在这里没有显示),并按预期运行:

R> Rcpp::sourceCpp("/tmp/soQ.cpp") 

R> ks(1.0, 2.0, 3.0, 4.0) 
[1] 0.135335 
R>