---
title: "Using Staninside"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Using Staninside}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
```

```{r setup}
library(staninside)
```

# Motivation

Stan is a powerful language and using R (and specifically rstan) as glue to allow R users to easily interface existing models.
Sometimes a user might wish to use a different backend (CmdStanR) or examine and modify the written Stan code directly.
This package seeks to allow users the ability to:

* Build R packages that are not pre-compiled by rstan
* Allow users to use CmdStanR in their R packages
* Allow users to easily see the Stan code within packages

## Building a Stan Package

### Package Infrastructure

If a package developer were to build a package with stanside, they first could create the package directory in the usual ways.

Next, to build the appropriate structure the author could call

```r
setup_stan_package()
```

This function will create the following directory tree:

```
.
├── inst
│   ├── stan
│   │   ├── base.stan
│   │   ├── data
│   │   ├── functions
│   │   ├── parameters

```
This provides the user with a structure to use when building their Stan programs.
For complicated programs, it is sometimes useful to break up the Stan code blocks into separate files stored in sub-directories. 
These separate `.stan` files can then be accessed within the Stan code with the following syntax:

```stan
# include functions/my_functions.stan
```
### Model Fitting

Generally speaking, there will be some function in an R package that will fit the data to a model. 
In order to faciliate this fitting with a CmdStanR backend, a process like that below could be used.

```r

fit_my_data <- function(my_data){
    requireNamespace("mypackage")
    local_location <- rappdirs::user_cache_dir(appname = "my_package")

    if (length(list.files(local_location, pattern = ".stan")) > 1) {
        cli::cli_alert_info("Using cached Stan models")
        cli::cli_alert_info(
        "Use `intervalcalc::clear_cache` if you need to refresh")
    } else {
        cli::cli_alert_info("Copying Stan models to cache")
        staninside::copy_models(this_pkg())
        cli::cli_alert_success("Models copied!")
    }
    
    model_file_path <- file.path(local_location, paste0("base", ".stan"))
        mod <- cmdstanr::cmdstan_model(model_file_path)
        
   fit <- mod$sample(data = my_data)
   
   return(fit)
}

```



