---
title: "Intro to csutil"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Intro to csutil}
  %\VignetteEncoding{UTF-8}
  %\VignetteEngine{knitr::rmarkdown}
editor_options: 
  chunk_output_type: console
---

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

## Splitting

```{r}
csutil::easy_split(letters[1:20], size_of_each_group = 3)
csutil::easy_split(letters[1:20], number_of_groups = 3)
```

## Unnesting data.frames

```{r}
x <- list(
  list(
    "a" = data.frame("v1"=1),
    "b" = data.frame("v2"=3)
  ),
  list(
    "a" = data.frame("v1"=10),
    "b" = data.frame("v2"=30),
    "d" = data.frame("v3"=50)
  )
)
print(x)
csutil::unnest_dfs_within_list_of_fully_named_lists(x)
```

## Describing lists

```{r}
csutil::is_fully_named_list(list(1))
csutil::is_fully_named_list(list("a"=1))

csutil::is_all_list_elements_null_or_df(list(data.frame()))
csutil::is_all_list_elements_null_or_df(list(1, NULL))

csutil::is_all_list_elements_null_or_list(list(1, NULL))
csutil::is_all_list_elements_null_or_list(list(list(), NULL))

csutil::is_all_list_elements_null_or_fully_named_list(list(list(), NULL))
csutil::is_all_list_elements_null_or_fully_named_list(list(list("a" = 1), NULL))
```

## Apply a function via hash table

This function extracts the unique input values, applies the given function to it to create a hash table (containing unique input/output combinations), and then matches the original input to the hash table to obtain the desired output.

This can dramatically speed up computation if there is a lot of data and a limited amount of unique values.

```{r}
input <- rep(seq(as.Date("2000-01-01"), as.Date("2020-01-01"), 1), 1000)
a1 <- Sys.time()
z <- format(input, "%Y")
a2 <- Sys.time()
a2 - a1

b1 <- Sys.time()
z <- csutil::apply_fn_via_hash_table(
  input,
  format,
  "%Y"
)
b2 <- Sys.time()
b2 - b1
```



