时间:2018-05-02 06:59:48

标签: r rcpp

我正在使用Rcpp在R中实现一个统计方法,并且根据SO上的重复建议,我将所有这些都放入一个包中。对于我的实现,我使用stochvol包中提供的随机波动率例程。链接按照Writing R Extensions 5.4.3 Linking to native routines in other packages中的说明完成,如下所示(stochvol字段中加LinkingTo):

#include <RcppArmadillo.h>
#include <R.h>
#include <R_ext/Rdynload.h>


void sv_update(const Rcpp::NumericVector &data, double *curpara_in, double *h_in,
               double &h0, double *mixprob, int *r,
               const bool centered_baseline, const double C0, const double cT,
               const double Bsigma, const double a0, const double b0,
               const double bmu, const double Bmu, const double B011inv,
               const double B022inv, const bool Gammaprior, const bool truncnormal,
               const double MHcontrol, const int MHsteps, const int parameterization,
               const bool dontupdatemu, const double priorlatent0) {
  static void(*fun)(const Rcpp::NumericVector &, double *, double *, double &, double *, int *, const bool, const double,
                    const double, const double, const double, const double, const double, const double, const double, const double,
                    const bool, const bool, const double, const int, const int, const bool, const double) = NULL;
  if (fun==NULL) {
    fun = (void(*)(const Rcpp::NumericVector &, double *, double *, double &, double *, int *, const bool, const double,
                   const double, const double, const double, const double, const double, const double, const double, const double,
                   const bool, const bool, const double, const int, const int, const bool, const double)) R_GetCCallable("stochvol", "update");
  }
  return fun(data, curpara_in, h_in, h0, mixprob, r, centered_baseline, C0, cT,
             Bsigma, a0, b0, bmu, Bmu, B011inv, B022inv, Gammaprior, truncnormal,
             MHcontrol, MHsteps, parameterization, dontupdatemu, priorlatent0);
}

这个函数有很多参数,所以它看起来不太吸引人,但是它已经运行了一段时间了。

我的问题是通常一切正常,所以在开发我的代码时,我编写了顺利运行的单元测试。但是,当我现在尝试在小型模拟中运行时,我得到:

function 'update' not provided by package 'stochvol'

在线信息稀少,但建议in this thread是重新安装软件包。我刚刚将R更新到3.5.0,没有复制任何软件包,但从头开始重新安装,但问题仍然存在。

关于我可以采取哪些措施来解决这个问题?

1 个答案:

答案 0 :(得分:2)

我认为这里有两个问题:

  1. 如果您使用的机制是指从一个软件包中正确导出函数,并在另一个软件包中重复使用,则设置可能不完整(因此无法使用),因为我看不到{{1提供例程的实际注册。将其与导出两个函数的init.c in RApiSerialize进行比较。

  2. 现在,对于C ++仅限标头的函数,我们不需要这样,因此stockvol可能只能用于标头,在这种情况下您不需要这种机制。然后,您引用的标题有stochvol。您可能需要联系Gregor并询问他的意图/看他是否有一个例子。对我来说,这与我在包中使用/正在使用的设置不匹配。 [编辑1:或许它确实如此,我对此没有实践。 R_GetCCallable似乎创造了类似的东西。]

  3. 还有一个:这个机制适用于C接口。因此不确定将RcppArmadillo标头放在那里并使用compileAttributes()是否是个好主意 - 您可能只需要Rcpp::NumericVector

    编辑2:当然,包'stochvol'未提供的错误消息 function'update'是SEXP包中没有的实际上运行stochvol,这样当你尝试R_RegisterCCallable("stockvol", "update")时,你确实在击中一个未导出的对象。因此错误。