---
title: "timeR Quick Start"
author: "Yifu Yan"
date: "`r Sys.Date()`"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{timeR Quick Start}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r setup, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
library(timeR)
```

`timeR` package creates a R6 class, which allows you to create a timer object
to easily time your codes. Meanwhile, all records are saved to a data frame, so it's easy to retrieve all the records for later use.

Timing codes is not difficult but can be very tedious. With `timeR`, you can save your energy on timing and put more effort on 
your analysis. You can use `timeR` to timing training time for machine learning models, record speed for requests hen running web-scraping codes or other situations that you need to keep records of time.

# Basic Usage

```{r}
library(timeR)
# Create a timer object(precision default to s)
my_timer <- createTimer()

# start timing for an event
my_timer$start("event one")

#start timing for another event
my_timer$start("event two")

# stop timing for the events
my_timer$stop("event one")
my_timer$stop("event two", comment = "my comment") # comment is optional

# retrieve the table for all recordings
getTimer(my_timer)


# or create a timer object and setting verbose to false
my_timer2 <- createTimer(verbose = F)

# toggle on/off verbose
my_timer$toggleVerbose()

# warnings will still be shown when verbose is turned off
my_timer$stop("event one")


```


# Comparison

Let's compare the workflow with and without `timeR` in the following scenario.

Our goal is to keep records of two events: **event 1** and **event 2**.  
We need to keep records of starting and stopping time for both events as well as calculate
the time difference between them. Also, we want to save those information to a data frame for later analysis.

## Timing Codes With `timeR`

```{r}
#initialize a timer object named mytimer: s, ms, us can be used as precision
mytimer <- createTimer(precision = "us")

# event 1
mytimer$start("event 1")
# do something here
Sys.sleep(1)
mytimer$stop("event 1")

#event 2
mytimer$start("event 2")
# do something here
Sys.sleep(1)
mytimer$stop("event 2",comment = "custom comment")

# print records
getTimer(mytimer)

# get attributes for selected events
mytimer$getStartTime("event 1")
mytimer$getStopTime("event 1")
mytimer$getTimeElapsed("event 1")
mytimer$getComment("event 1")
mytimer$getEvent("event 1")
```


## Timing Codes Conventionally

```{r}
#initalize a dataframe to store the information
timer_df = data.frame(matrix(ncol = 5, nrow = 0))
colnames(timer_df) <- c("event","start","end","timeElapsed","comment")
#event 1
t1 <- Sys.time()
# do something here
Sys.sleep(1)
t2 <- Sys.time()

timer_df <- rbind(timer_df,
                  data.frame(start = t1, 
                             end = t2, 
                             event = "event 1",
                             timeElapsed = t2-t1,
                             comment=NA))

#event 2
t1 <- Sys.time()
# do something here
Sys.sleep(1)
t2 <- Sys.time()

timer_df <- rbind(timer_df,
                  data.frame(start = t1, 
                             end = t2, 
                             event = "event 2",
                             timeElapsed = t2-t1,
                             comment = "custom comment"))

# print records
timer_df
```

