Description
Extend the Behaviour of a Function without Explicitly Modifying it.
Description
A decorator is a function that receives a function, extends its behaviour, and returned the altered function. Any caller that uses the decorated function uses the same interface as it were the original, undecorated function. Decorators serve two primary uses: (1) Enhancing the response of a function as it sends data to a second component; (2) Supporting multiple optional behaviours. An example of the first use is a timer decorator that runs a function, outputs its execution time on the console, and returns the original function's result. An example of the second use is input type validation decorator that during running time tests whether the caller has passed input arguments of a particular class. Decorators can reduce execution time, say by memoization, or reduce bugs by adding defensive programming routines.
README.md
decorators
A decorator is a function that receives a function, extends its behaviour, and returned the altered function. Any caller that uses the decorated function uses the same interface as it were the original, undecorated function.
Examples
time_it
decorator
# Running the original Sys.sleep() produces no output
Sys.sleep(0.1)
# Decorating the Sys.sleep() with time_it() measures Sys.sleep() execution time
# and outputs the measurement
Sys.sleep <- decorators::time_it(base::Sys.sleep)
Sys.sleep(0.1)
#> Time difference of 0.11 secs
validate_arguments
decorator
## Define a functions that averages two numbers
average_two_numbers <- function(a = NA_real_, b = NA_real_) mean(c(a, b))
## Before: Averaging two nun-numeric values returns NA and prompts a warning
average_two_numbers(a = "1", b = "2")
#> [1] NA
## Decorating average_two_numbers() with validate_arguments() checks input types
average_two_numbers <- decorators::validate_arguments(average_two_numbers)
## After: Averaging two nun-numeric prompts an informative error
average_two_numbers(a = "1", b = "2")
#> Error in average_two_numbers(a = "1", b = "2") :
#> a is of type `character` rather than `numeric`!
Installation
You can install the released version of decorators
from CRAN with:
install.packages("decorators")
And the development version from GitHub with:
# install.packages("devtools")
devtools::install_github("tidylab/decorators")