无法将Rcpp::sugar::Plus_Vector_原语转换为Rcpp::traits::storage_类型

无法将Rcpp::sugar::Plus_Vector_原语转换为Rcpp::traits::storage_类型,r,rcpp,armadillo,R,Rcpp,Armadillo,我基本上是想用Rcpp把一些R代码翻译成cpp。我在下面的代码中遇到以下错误: 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 d

我基本上是想用
Rcpp
把一些
R
代码翻译成
cpp
。我在下面的代码中遇到以下错误:

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
错误:无法在赋值中将'Rcpp::sugar::Plus_Vector_Primitive'转换为'Rcpp::traits::storage_type::type{aka double}'
这是密码

 #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;
}
#包括
#包括
使用名称空间Rcpp;
//[[Rcpp::depends(RcppArmadillo)]]
//[[Rcpp::导出(“.loop\u exp”)]]
无效mm_mult(常数arma::vec&helpa,常数arma::mat&helpb,常数arma::vec&helpc,
常量Rcpp::NumericVector&t1,常量arma::vec&t2,int J,Rcpp::NumericVector&prob)
{
int j;

对于(j=1;j原因是,
dnorm
“合成糖”有一个签名
NumericVector dnorm(NumericVector,double,double)

由于它返回一个
数值向量
,您必须自己将其转换为一个
双精度

一种快速且简单(但不是很健壮)的方法是对返回的向量进行子集,以仅获取其第一个元素。在您的示例中:

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

否则,代码中还有一些其他潜在问题:您不应该
#include
,因为
#include
——还有循环结束条件,
J。这解决了编译错误,仔细想想,您的意思可能是用eit存储
J-th
元素her
prob[j]=(helpa[j]+dnorm(t1,tt,helpc[j]);
prob[j]=(helpa[j]+dnorm(t1[j],tt,helpc[j]);
命名空间中的标量变量提供了一种替代方法:
R::dnorm()
——请参见文件
Rmath.h