Devtools::build(binary = TRUE) problem with a package using rstan


I am trying to develop a package for a model using Stan that can be distributed to users as a binary on Windows to avoid having to install Rtools. The package is here:

As well as the rstan sampler and optimizer, it has 3 Rcpp functions which are also installed.

This is a work in progress, but the package works fine if I install using remotes and compile locally using Rtools. However, if I build the package first as a binary using

devtools::build(binary = TRUE)

and install from there the rstan optimizer/sampler gives me an error:

“Error in new_CppObject_xp(fields$.module, fields$.pointer, …) :
Exception: variable does not exist; processing stage=data initialization; variable name=Len; base type=double (in ‘string’, line 220, column 2 to column 18)”

The variable “Len” is in the data list, so it’s something else that is going wrong.

When running the devtools::build(), a file “init.c” is created which references my Rcpp functions, but not the stan functions. Similarly the stan references are removed from the RcppExports.cpp file.

If I add the references back in by hand, the package checks out fine. So for init.c the corrected file is:

/* Section generated by pkgbuild, do not edit */
/* .Call calls */
extern SEXP _fishblicc_CNinInterval(SEXP, SEXP);
extern SEXP _fishblicc_Csel_dsnormal(SEXP, SEXP, SEXP, SEXP);
extern SEXP _fishblicc_CSurvival_Est(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP);
extern RcppExport SEXP _rcpp_module_boot_stan_fit4BLICC_mod(); /* MANUALLY ADDED */

static const R_CallMethodDef CallEntries[] = {
    {"_fishblicc_CNinInterval",  (DL_FUNC) &_fishblicc_CNinInterval,  2},
    {"_fishblicc_Csel_dsnormal", (DL_FUNC) &_fishblicc_Csel_dsnormal, 4},
    {"_fishblicc_CSurvival_Est", (DL_FUNC) &_fishblicc_CSurvival_Est, 6},
    {"_rcpp_module_boot_stan_fit4BLICC_mod", (DL_FUNC) &_rcpp_module_boot_stan_fit4BLICC_mod, 0},      /* MANUALLY ADDED */
    {NULL, NULL, 0}
/* End section generated by pkgbuild */

When I rerun the devtools::build() it, of course, overwrites this, so it’s not really a solution.

When running devtools:check() the only note I can’t get rid of is “GNU make is a SystemRequirements.” which I don’t think matters. There are no other problems.

rstantools version 2.2.0
rstan version 2.26.13
devtools version 2.4.4
R version 4.2.1
Windows version 10

DESCRIPTION file part:

    Rcpp (>= 0.12.0),
    rstan (>= 2.18.1),
    testthat (>= 3.0.0)
    BH (>= 1.66.0),
    Rcpp (>= 0.12.0),
    RcppEigen (>=,
    RcppParallel (>= 5.0.1),
    rstan (>= 2.18.1),
    StanHeaders (>= 2.18.0)
Biarch: true
Config/testthat/edition: 3
Encoding: UTF-8
LazyData: true
Roxygen: list(markdown = TRUE)
RoxygenNote: 7.2.1
SystemRequirements: GNU make

Thanks for any help or pointers to documentation.