2017-10-09 112 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>