包未提供的功能
function not provided by package
我正在使用 Rcpp 在 R 中实现一种统计方法,并且根据 SO 上重复给出的建议,我将所有这些都放入了一个包中。对于我的实施,我使用 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,没有复制任何包,而是从头开始重新安装所有内容,但问题仍然存在。
有什么办法可以解决这个问题吗?
我认为这里有两个问题:
如果您使用的是从一个包中正确导出函数的机制,而在另一个包中使用 re-use,那么设置可能不完整(因此无法使用),因为我没有看到 stockvol
提供实际的例程注册。将其与导出两个函数的 init.c in RApiSerialize 进行比较。
现在,对于 C++ header-only 函数,我们不需要它,因此 stochvol
可能意味着要使用 header-only,在这种情况下您不需要这个机制。再说一次,您所指的 header 有 R_GetCCallable
。您可能需要联系 Gregor 并询问他的意图/查看他是否有示例。对我来说,这与我在包中使用/正在使用的设置不匹配。 [编辑 1:或者也许是这样,我对此不熟悉。 compileAttributes()
似乎创造了类似的东西。]
还有一点:此机制适用于 C 接口。所以不确定将 RcppArmadillo header 放在那里并使用 Rcpp::NumericVector
是否是个好主意——你可能只需要 SEXP
。
编辑 2: 当然错误消息 function 'update' not provided by package 'stochvol' 是stochvol
包的 spot 实际上并没有 运行 R_RegisterCCallable("stockvol", "update")
,所以当你尝试 R_GetCCallable("stochvol", "update");
时,你确实遇到了 non-exported object。因此错误。
我正在使用 Rcpp 在 R 中实现一种统计方法,并且根据 SO 上重复给出的建议,我将所有这些都放入了一个包中。对于我的实施,我使用 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,没有复制任何包,而是从头开始重新安装所有内容,但问题仍然存在。
有什么办法可以解决这个问题吗?
我认为这里有两个问题:
如果您使用的是从一个包中正确导出函数的机制,而在另一个包中使用 re-use,那么设置可能不完整(因此无法使用),因为我没有看到
stockvol
提供实际的例程注册。将其与导出两个函数的 init.c in RApiSerialize 进行比较。现在,对于 C++ header-only 函数,我们不需要它,因此
stochvol
可能意味着要使用 header-only,在这种情况下您不需要这个机制。再说一次,您所指的 header 有R_GetCCallable
。您可能需要联系 Gregor 并询问他的意图/查看他是否有示例。对我来说,这与我在包中使用/正在使用的设置不匹配。 [编辑 1:或者也许是这样,我对此不熟悉。compileAttributes()
似乎创造了类似的东西。]
还有一点:此机制适用于 C 接口。所以不确定将 RcppArmadillo header 放在那里并使用 Rcpp::NumericVector
是否是个好主意——你可能只需要 SEXP
。
编辑 2: 当然错误消息 function 'update' not provided by package 'stochvol' 是stochvol
包的 spot 实际上并没有 运行 R_RegisterCCallable("stockvol", "update")
,所以当你尝试 R_GetCCallable("stochvol", "update");
时,你确实遇到了 non-exported object。因此错误。