функция не предоставляется пакетом - PullRequest
0 голосов
/ 02 мая 2018

Я реализую статистический метод в R, используя Rcpp, и в соответствии с повторяющимся советом, данным для SO, я поместил все это в пакет. Для своей реализации я использую процедуру стохастической волатильности, доступную в пакете stochvol. Связывание выполняется, как описано в Запись расширений R 5.4.3 Связывание с собственными подпрограммами в других пакетах и выглядит следующим образом (плюс 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'

Информация в сети редкая, но предложение в этой теме - переустановить пакет. Я только что обновил R до 3.5.0, не копировал никаких пакетов, но переустанавливал все с нуля, но проблема остается.

Есть идеи, что я могу сделать, чтобы это исправить?

1 Ответ

0 голосов
/ 02 мая 2018

Я думаю, что здесь есть две проблемы:

  1. Если вы используете механизм, о котором вы говорите, для правильного экспорта функций из одного пакета и повторного использования в другом, то установка может быть неполной (и, следовательно, неиспользуемой), поскольку я не вижу stockvol обеспечение фактической регистрации процедур. Сравните это с init.c в RApiSerialize , который экспортирует две функции.

  2. Теперь для функций только для заголовков C ++ нам это не нужно, поэтому stochvol может использоваться только для заголовков, и в этом случае вам не понадобится этот механизм. С другой стороны, заголовок, на который вы ссылаетесь, имеет R_GetCCallable. Возможно, вам придется связаться с Грегором и спросить его, что он намеревался / посмотреть, если у него есть пример Для меня это не соответствует настройке, которую я использовал / использую в пакетах. [Редактировать 1: Или, может быть, так и есть, и я не практикуюсь с этим. compileAttributes() похоже создает нечто подобное.]

И еще одно: этот механизм предназначен для интерфейсов Си. Поэтому не уверен, стоит ли помещать туда заголовок RcppArmadillo и использовать Rcpp::NumericVector - вам может понадобиться только SEXP.

Редактировать 2: И, конечно, сообщение об ошибке функция 'update', не предоставляемая пакетом 'stochvol' , это место в пакете stochvol, фактически не запущенное R_RegisterCCallable("stockvol", "update") чтобы при попытке R_GetCCallable("stochvol", "update"); вы действительно столкнулись с неэкспортированным объектом. Отсюда и ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...