【发布时间】:2018-07-30 04:55:28
【问题描述】:
我正在编写 rcpp 代码,我想在包“invgamma”中使用函数 dinvgamma(rinvgamma)。以下是我的所有代码。我尝试将包“invgamma”放入环境中,然后在其中调用函数作为 Rcpp::Function。
#include <Rcpp.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <R_ext/Utils.h>
using namespace Rcpp;
// [[Rcpp::export]]
RcppExport SEXP updatesigama2_mu(SEXP sigma2_mu,
SEXP mu,
SEXP u0,
SEXP v0,
SEXP K,
SEXP SS,
SEXP acc,
SEXP sigma2_mu_list)
{
BEGIN_RCPP
Rcpp::Environment invgamma("package:invgamma");
Rcpp::Function dinvgamma = invgamma["dinvgamma"];
Rcpp::Function rinvgamma = invgamma["rinvgamma"];
double xacc = Rcpp::as<double>(acc);
Rcpp::NumericVector xsigma2_mu_list(sigma2_mu_list);
Rcpp::NumericVector xmu(mu);//vector mu
double xsigma2_mu = Rcpp::as<double>(sigma2_mu);
int xK = Rcpp::as<int>(K);
int xSS = Rcpp::as<int>(SS);// time for irrecation
double xu0 = Rcpp::as<double>(u0);
double xv0 = Rcpp::as<double>(v0);
Rcpp::RNGScope scope;
int c = 0; int d = 0;
c = xu0 + 0.5*xK + 1;
d = xv0 + 0.5*sum(xmu);
for (int ss = 0; ss<xSS; ss++){//iteration
Rcpp::NumericVector tmp = rinvgamma(1,0,1);//proposal distribution Normal(0,10)
Rcpp::NumericVector u = Rcpp::runif(1);
Rcpp::NumericVector a = dinvgamma(tmp[0], c, pow(d,-1),d, false ) * dinvgamma(xsigma2_mu,1,0,1,false)/
(dinvgamma(xsigma2_mu,c,pow(d,-1),d,false)*dinvgamma(tmp[0],1,0,1,false))
xsigma2_mu_list[1] = tmp[0];
xsigma2_mu_list[2] = a[0];
if ( u[0] <= a[0] ){
xsigma2_mu = tmp[0];
xacc += 1;
}
}
return Rcpp::List::create(Rcpp::Named("sigma2_mu") = xsigma2_mu,
Rcpp::Named("acc") = xacc,
Rcpp::Named("sigma2_mu_list") = xsigma2_mu_list);
END_RCPP
}
我将它用作以下形式,但它不起作用。它错过了排队的东西吗?
Rcpp::NumericVector a = dinvgamma(tmp[0], c, pow(d,-1),d, false ) * dinvgamma(xsigma2_mu,1,0,1,false)/
(dinvgamma(xsigma2_mu,c,pow(d,-1),d,false)*dinvgamma(tmp[0],1,0,1,false))
【问题讨论】:
-
请详细说明您的错误是什么,因为“如何将R包中的函数添加到rcpp代码中”已经回答了很多次了。
-
错误是“没有匹配函数调用'dinvgamma'。”。看来我没有把这个功能变成环境。我的调用命令错了吗?
-
我得到的唯一错误是
invalid operands of types 'SEXP' and 'SEXP' to binary 'operator*'。 -
请尝试将edit 你的示例通过删除不需要产生错误的代码变成minimal reproducible example。
-
请注意,所有 invgamma 函数只是 gamma 函数的简单包装。后者可用作糖函数。