2015-10-14 22 views
1

我基本上試圖使用Rcpp將一些R代碼翻譯爲cpp。我在下面的代碼以下錯誤:無法將Rcpp :: sugar :: Plus_Vector_Primitive轉換爲Rcpp :: traits :: 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'元素,無論是'概率[ j] =(helpa [j] + dnorm(t1,tt,helpc [j])[j]);'或'prob [j] =(helpa [j] + dnorm(t1 [j],tt,helpc [ j])[0]);' – Jealie

+2

另一種方法是由'R'命名空間中的_scalar_變體提供:'R :: dnorm()' - 參見文件'Rmath.h'。 –