Based on this thread
and this one
and this very sage advice in a third thread
I settled on adding the following bit of code in the automatically generated stanmodels.R
before rm(MODELS_HOME)
. I also added an extra folder src/stan/stan_functions
.
# Start Addition Stijn
stan_function_files <-dir(file.path(MODELS_HOME, "stan_functions"),
pattern = "stan$", full.names = TRUE)
lapply(stan_function_files, function(f) {
file_name <- sub("\\.stan$", "", basename(f))
stan_model <- rstan::stanc(f, allow_undefined = TRUE,
obfuscate_model_name = FALSE)
rstan::expose_stan_functions(stan_model,
cacheDir = file.path(MODELS_HOME,
"stan_functions",
file_name),
cleanupCacheDir = TRUE)
}
)
Rcpp::compileAttributes()
# End Addition Stijn
The code is very much modelled after what is already in stanmodels.R
. That is, it loops over all files in the new folder, exposes the functions in a separate subfolder for each file, and cleans up any old .cpp (hence the separate folders). Finally, compileAttributes gathers and links all the functions.
If I figure out how stanmodels.R
gets called at installation, I make a separate file with this bit of code to keep the original file pristine.