2016-12-06 6 views
2

Я пробуя Rcpp/RcppArmadillo в RStudio со следующим кодом:Rcpp Armadillo: RStudio говорит "ехр" неоднозначен

#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.

Изображение что происходит

enter image description here

+0

Когда вы говорите: * «RStudio говорит» *, вы говорите о сообщениях диагностики кода в среде IDE? Или вы получаете фактическую ошибку компилятора? – nrussell

+1

Во всяком случае, я бы посоветовал использовать неквалифицированный 'exp', поскольку (на основе объявлений в приведенном выше коде) это может относиться к' exp' 'пространству имен' std :: 'или' exp' из 'Rcpp :: 'namespace (и, возможно, C-функция' exp' от ''). – nrussell

+0

Спасибо @nrussell. Код компилируется без ошибок. Это IDE, которое дает это диагностическое сообщение. – ekvall

ответ

2

Для начала, не делают

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 сахара, используя наши векторы
  • arma::exp() от Armadillo, используя свои векторы

и я всегда находил проще всего быть явным.

Редактировать: Я пропустил log1p. Для префикса с std:: также требуется C++ 11. Сделано два изменения.

+0

Спасибо, что согласился. Повторно прочитав, я думаю, что дело _may_ будет сделано, что это ошибка IDE. Вы объявляли 'std :: exp' через' use', но получили предупреждение. Ну что ж. Мой совет «лучше безопасный, чем жалкий» по-прежнему сохраняется. –

+0

Да, это действительно снова появилось даже в новой версии IDE.Если я скопирую код в свой код, RStudio говорит, что использование exp снова неоднозначно. Я просто буду следовать вашим советам и быть явным и игнорировать сообщение RStudio. – ekvall