Распределение функций TMB в пакетах R и проверках CRAN
У меня 9 файлов cpp в /src - 8 из Rcpp и 1 из TMB. Я могу скомпилировать все и успешно выполнить код ИЛИ пройти проверки CRAN. Но не оба.
Способ 1
Пусть R скомпилирует все файлы cpp и сгенерирует одну DLL: "mypackage.dll" и TMB::MakeADfun(..., DLL="mypackage")
:
- проходит все проверки CRAN (кроме примечания об установленном размере пакета, см. ниже).
- Rcpp функции работают нормально
- вызов функции TMB приводит к:
Error in .Call("getParameterOrder", data, parameters, new.env(), PACKAGE = DLL) : "getParameterOrder" not available for .Call() for package "mypackage"
- с помощью
TMB::MakeADFun(..., DLL="mypackage", checkParameterOrder=FALSE)
результаты в:Error in .Call("TMBconfig", e, as.integer(1), PACKAGE = DLL) : "TMBconfig" not available for .Call() for package "mypackage"
Способ 2
Используйте 'makevars.win' после этого предложения, добавьте useDynLib MyTMB
, а также TMB::MakeADfun(..., DLL="MyTMB")
и создайте две библиотеки DLL (mypackage.dll и MyTMB.dll):
makevars.win:
all: MyTMB.dll
MyTMB.dll: MyTMB.cpp
$(R_HOME)/bin$(R_ARCH_BIN)/Rscript --vanilla -e "TMB::compile('MyTMB.cpp', safebounds=FALSE, safeunload=FALSE)"
clean:
rm -rf *o
- обе функции Rcpp и TMB работают
devtools::check() приводит к одному предупреждению для каждой из функций Rcpp:
checking foreign function calls ... WARNING Foreign function calls to a different package: .Call("_rcppfunction1", ..., PACKAGE = "mypackage")
- и одна заметка о большом размере установленного пакета.
libs
подкаталог занимает более 30 МБ и примерно вдвое больше, чем метод 1.
Разработчики Rcpp рекомендуют не использовать файл makevars, и, очевидно, я перезаписываю что-то из Rcpp, чтобы вызвать проблему "вызовов внешних функций", даже если пакет является текущим пакетом. Похоже, мои варианты:
- измените 'makevars', чтобы восстановить значения по умолчанию Rcpp, которые избегают предупреждения, и попросите CRAN принять примечание об установленном размере пакета. Не уверен, как сделать первое.
- найти решение проблемы 1 и попросить установить меньший размер установленного пакета. Было бы самое простое решение только с одной DLL. Не уверен, что проблема вызвана тем, что я компилирую Rcpp и TMB, и если да, то как это исправить.
- или что-то еще, что я скучаю.
Какие-либо предложения?
R детали:
платформа x86_64-w64-mingw32
арка x86_64
os mingw32
система x86_64, mingw32
статус
основной 3
несовершеннолетний 3.3