2015-10-14 4 views
1

Я в основном пытаюсь перевести код R в cpp с помощью Rcpp. Я получил следующие ошибки в коде ниже:Невозможно преобразовать Rcpp :: sugar :: Plus_Vector_Primitive в Rcpp :: черты :: storage_type

error: cannot convert ‘Rcpp::sugar::Plus_Vector_Primitive<14, true, Rcpp::stats::D2<14, true, Rcpp::Vector<14, Rcpp::PreserveStorage> > >’ to ‘Rcpp::traits::storage_type<14>::type {aka double}’ in assignment 

Вот код

#include <RcppArmadillo.h> 
#include <Rcpp.h> 

using namespace Rcpp; 

// [[Rcpp::depends(RcppArmadillo)]] 

// [[Rcpp::export(".loop_exp")]] 
void mm_mult(const arma::vec& helpa, const arma::mat& helpb, const arma::vec& helpc, 
      const Rcpp::NumericVector& t1, const arma::vec& t2, int J, Rcpp::NumericVector& prob) 
{ 
    int j; 
    for (j = 1; J <= J; j++) 
    { 
    arma::mat t = (helpb.row(j)).t() * (t2); 
    double tt = t[0,0]; 
    prob[j] = (helpa[j] + dnorm(t1, tt, helpc[j])); <---- here is the error 
    } 

    return; 
} 

Я думаю, это ошибка литья типа, но в основном я не могу найти хорошую ссылку .. Может кто-нибудь дать Мне нужна помощь в этом вопросе? Большое спасибо!

ответ

3

Причина в том, что «синтаксический сахар» dnorm имеет подпись NumericVector dnorm(NumericVector, double, double).

Как только он возвращает NumericVector, вы должны преобразовать его в значение double.

Быстрый и простой (и не очень надежный) способ заключается в подмножестве возвращаемого вектора, чтобы получить только его первый элемент. В вашем примере:

prob[j] = (helpa[j] + dnorm(t1, tt, helpc[j])[0]); // Note the "[0]" 

В противном случае, есть несколько других потенциальных проблем в коде: вы не должны #include <Rcpp.h>, как это уже сделано с #include <RcppArmadillo.h> --- также, ваш цикл заканчивается, состояние J <= J, внешний вид мне подозрительный ...

Надеется, что это помогает :)

+0

в то время как это решает ошибку компиляции, больше думать об этом, что вы, вероятно, имели в виде, чтобы сохранить 'J-th' элемент, либо' P [ j] = (helpa [j] + dnorm (t1, tt, helpc [j]) [j]); 'или' prob [j] = (helpa [j] + dnorm (t1 [j], tt, helpc [ j]) [0]); ' – Jealie

+2

Альтернатива предоставляется вариантом _scalar_ в пространстве имен 'R':' R :: dnorm() '- см. Файл' Rmath.h'. –

Смежные вопросы