包中未提供的功能 [英] function not provided by package

查看:28
本文介绍了包中未提供的功能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用RCPP在R中实现一个统计方法,并且根据上反复给出的建议,我已经将所有这些都放到了一个包中。在我的实现中,我使用stochvol包中提供的随机波动例程。链接按照Writing R Extensions 5.4.3 Linking to native routines in other packages中的说明进行,如下所示(在LinkingTo字段中加上stochvol):

#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. 如果您使用的是从一个包中正确导出函数,然后在另一个包中重用的机制,则设置可能不完整(因此不可用),因为我认为stockvol没有提供例程的实际注册。与导出两个函数的init.c in RApiSerialize进行比较。

  2. 现在,对于仅限标头的C++函数,我们不需要,因此stochvol可能仅用于标头-在这种情况下,您将不需要此机制。同样,您引用的标头具有R_GetCCallable。你可能需要联系格雷戈尔,问他打算做什么/看看他是否有这样的例子。对我来说,这与我在包中已经使用/正在使用的设置不匹配。[编辑1:也可能是这样的,我已经不习惯这个了。compileAttributes()似乎创造了类似的东西。]

    /li>

还有一点:这个机制是针对C接口的。因此,不确定将RcppArmadillo标头放入其中并使用Rcpp::NumericVector是否合适--您可能只需要SEXP

编辑2:,当然,错误消息函数‘UPDATE’不是由程序包‘stochol’提供的stochvol程序包没有实际运行R_RegisterCCallable("stockvol", "update"),因此当您尝试R_GetCCallable("stochvol", "update");时,您确实遇到了一个未导出的对象。因此出现错误。

这篇关于包中未提供的功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆