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

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

The problem arises when we have to use time-series in a data.frame or use time-series
operations like `lag` and `diff` for numeric vectors in a data.frame. Let's look into
an example.

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

<!-- Some functions require inheritnly the frequency (like decompose or stl) of the time-series. Although the input can be `ts` and `xts` object, the output will always be a numeric vector. 
* stats
* dplyr
* tsibble
-->

First, wee restrict tibble printing options to minimize the space occupied.

```{r problem, message=FALSE}
library(dplyr)
options(tibble.print_min = 3)
```

Let's load the economics dataset from `ggplot2` for illustration.

```{r}
econ <- ggplot2::economics
econ
```

Then, we are going to use some `stats` functions:

```{r exist-already, error=TRUE}
mutate(econ, pop_lag = stats::lag(as.ts(pop)))
```

`base::lag` only works on `ts` objects. However, dplyr has thought about this problem

```{r dplyr-lag}
mutate(econ, pop_lag = dplyr::lag(pop))
```

However, this problem extends to all the univariate functions that are applied in
the same manner in a data.frame. For example

```{r example-diff, error=TRUE}
mutate(econ, pop_diff = base::diff(pop))
```

The idea for `transx` is coming from the need to construct wrapper functions.

```{r new-fun}
diffx <- function(x, ...) x - dplyr::lag(x, ... )

mutate(econ, pop_diff = diffx(pop))
```
