---
title: "sgsR"
output: rmarkdown::html_vignette
description: >
  Learn how to use sgsR.
vignette: >
  %\VignetteIndexEntry{sgsR}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
```

## Algorithm structure {#str .unnumbered}

`sgsR` is scripted using the `terra` package to handle raster processing, and `sf` package for vector manipulation. 

Four primary function verbs exist:

### `strat_*`

Stratification algorithms within `sgsR`. These algorithms use auxiliary raster data (e.g. ALS metric populations) as inputs and provide stratified areas of interest as outputs. Algorithms are either supervised (e.g. `strat_breaks()`), where the user provides quantitative values that drive stratifications, or unsupervised (e.g. `strat_quantiles()`), where the user specifies the desired number of output strata (`nStrata`) and stratification is handled by the algorithm.

### `sample_*`

Sampling algorithms in `sgsR`. Depending on the sampling algorithm, users are able to provide either auxiliary metrics or stratifications derived from `strat_*` functions as inputs. A number of customizable parameters can be set including the sample size (`nSamp`), a minimum distance threshold (`mindist`) between allocated sample units, and the ability for the user to define an access network (`access`) and assign minimum (`buff_inner`) and maximum (`buff_outer`) buffer distances to constrain sampling extents.

### `calculate_*` & `extract_*`

Additional helper functions that `calculate` varying descriptive / summary statistics and values to use in processing. `extract_*` functions derive metric values from co-located sample units. 

## Parameters {#params .unnumbered}

`sgsR` uses common words that define algorithm parameters:

```{r echo=FALSE}
p <- c("`mraster`", "`sraster`", "`access`", "`existing`", "`plot`")

d <- c("Metric raster(s)", "Stratified raster", "Linear vectors representing access routes", "Existing sample units", "Visually displays raster and samples")

df <- data.frame(Parameter = p, Description = d)

knitr::kable(df, align = "c")
```

### `mraster` {#mrast .unnumbered}

`mraster` are input raster(s). All raster data used by `sgsR` must be must be a [`terra SpatRaster`](https://cran.r-project.org/package=terra) class.

```{r,warning=F,message=F}
library(sgsR)
library(terra)
library(sf)

#--- Load mraster from internal data ---#
r <- system.file("extdata", "mraster.tif", package = "sgsR")

#--- load mraster using the terra package ---#
mraster <- terra::rast(r)
```

### `sraster` {#srast .unnumbered}

`sraster` are derived from `strat_*` algorithms (e.g. see `strat_quantiles()` below). The function below used the distribution of `mraster$zq90` and stratified data into 4 equally sized strata.

```{r,warning=F,message=F}
#--- apply kmeans algorithm to metrics raster ---#
sraster <- strat_quantiles(
  mraster = mraster$zq90, # use mraster as input for sampling
  nStrata = 4, # algorithm will produce 4 strata
  plot = TRUE
) # algorithm will plot output
```

The `sraster` output can then become an input parameter (`sraster`) for the `sample_strat()` algorithm.

```{r,warning=F,message=F}
#--- apply stratified sampling ---#
existing <- sample_strat(
  sraster = sraster, # use mraster as input for sampling
  nSamp = 200, # request 200 samples be taken
  mindist = 100, # define that samples must be 100 m apart
  plot = TRUE
) # algorithm will plot output
```

### `access` {#access .unnumbered}

One key feature of using some `sample_*` functions is its ability to define `access` corridors. Users can supply a road `access` network (must be `sf` line objects) and define buffers around `access` where samples should be excluded and included. 

Relevant and applicable parameters when `access` is defined are:

* `buff_inner` - Can be left as `NULL` (default). Inner buffer parameter that defines the distance from `access` where samples cannot be taken (i.e. if you don't want samples within 50 m of your `access` layer set `buff_inner = 50`). 

* `buff_outer` - Outer buffer parameter that defines the maximum distance that the samples can be located from `access` (i.e. if you don't want samples more than 200 meters from your `access` layer set `buff_inner = 200`).

```{r,warning=F,message=F}
a <- system.file("extdata", "access.shp", package = "sgsR")

#--- load the access vector using the sf package ---#
access <- sf::st_read(a)
```

```{r,warning=F,message=F}
terra::plot(mraster$zq90)
terra::plot(access, add = TRUE, col = "black")
```

From the plot output we see the first band (`zq90`) of the `mraster` with the `access` vector overlaid. 

## `%>%` {#pipe .unnumbered}

The sgsR package leverages the `%>%` operator from the [`magrittr package`](https://cran.r-project.org/package=magrittr).

```{r pipe, eval= FALSE}
#--- non piped ---#
sraster <- strat_quantiles(
  mraster = mraster$zq90, # use mraster as input for sampling
  nStrata = 4
) # algorithm will produce 4 strata

existing <- sample_strat(
  sraster = sraster, # use mraster as input for sampling
  nSamp = 200, # request 200 samples be taken
  mindist = 100
) # define that samples must be 100 m apart

extract_metrics(
  mraster = mraster,
  existing = existing
)

#--- piped ---#
strat_quantiles(mraster = mraster$zq90, nStrata = 4) %>%
  sample_strat(., nSamp = 200, mindist = 100) %>%
  extract_metrics(mraster = mraster, existing = .)
```

