Title: | Transform Functions using Decorators |
Version: | 0.0.1 |
Description: | Instead of nesting function calls, annotate and transform functions using "#." comments. |
License: | MIT + file LICENSE |
URL: | https://github.com/nteetor/tinsel |
BugReports: | https://github.com/nteetor/tinsel/issues |
Encoding: | UTF-8 |
RoxygenNote: | 5.0.1 |
Depends: | R (≥ 3.3.1) |
Suggests: | testthat, rstudioapi |
NeedsCompilation: | no |
Packaged: | 2016-11-16 18:07:32 UTC; nathanteetor |
Author: | Nathan Teetor [aut, cre] |
Maintainer: | Nathan Teetor <nathanteetor@gmail.com> |
Repository: | CRAN |
Date/Publication: | 2016-11-17 08:27:54 |
tinsel: Transform Functions using Decorators
Description
tinsel provides a decorator syntax for R allowing decoration and
transformation of functions using #.
comments.
Details
To the package in action save the code snippet below to a file, run
source_decoratees
on the file, and then call tmbg()
or
cats(5)
.
# emphasize text emph <- function(f, style = '**') { function(...) { if (length(style) == 1) { paste(style, f(...), style) } else { paste(style[1], f(...), style[2]) } } } #. emph tmbg <- function() { 'tmbg are okay' } #. emph(c('<b>', '</b>')) cats <- function(n) { paste(rep('cats', n), collapse = ' ') }
The call you make to tmbg
is equivalent to emph(tmbg)
. The
second example, cats(5)
, illustrates passing arguments to the
decorator function.
While the above examples are small hopefully you begin to see how decorators may be used to transform or ensure function output without modifying the function's code by hand.
Get Function Decorators or Original Function
Description
Get the decorators of a function or the original decoratee function from a decorated function object.
Usage
decorators(f)
original(f)
Arguments
f |
A decorated function. |
Examples
source_decoratees(tinsel_example('attributes.R'))
# sourced from the 'attributes.R' example file
selector1
# get a list of decorators wrapping a function
decorators(selector1)
# get the original decoratee function of the
# decorated `selector1` function
original(selector1)
Decorated Functions
Description
Returns TRUE
if the function f
is decorated, otherwise
FALSE
.
Usage
is.decorated(f)
Arguments
f |
A function. |
Value
TRUE
or FALSE
.
Examples
source_decoratees(tinsel_example('timer.R'))
# sourced from the timer.R example file
is.decorated(waldo)
is.decorated(jack)
# it's a function, but not decorated
is.decorated(mean)
# far from the mark
is.decorated(3030)
Print a Decorated Function
Description
The print.decorated
function naively prints x
as a function. In
reality, the function printed may be the final of any number of decorators to
a decoratee. To get the original function or the decorators wrapping it use
original
and decorators
.
Usage
## S3 method for class 'decorated'
print(x, ...)
Arguments
x |
A decorated function. |
... |
Additional arguments for next |
Examples
source_decoratees(tinsel_example('tags.R'))
print(html_paragraph)
print(html_bold)
Read and Parse Decoratees from a File
Description
Given a file, source_decoratees
reads and parses decorated functions
(decoratees) into the calling environment.
Usage
source_decoratees(file)
Arguments
file |
A character string specifying a file path. |
Details
Malformed decoratees are ignored and a message will alert the user a function has been skipped. However, an error is raised if a decorator is undefined.
If you are working within RStudio the "Source Active File Decoratees" addin
effectively allows you to bind source_decoratees
to a keyboard
shorcut. The addin is found under Tools > Addins.
Examples
# source example files
source_decoratees(tinsel_example('attributes.R'))
source_decoratees(tinsel_example('tags.R'))
# the important thing is to look at the contents
# of the example files, note the use of the special
# "#." comment
writeLines(readLines(tinsel_example('attributes.R')))
writeLines(readLines(tinsel_example('tags.R')))
# the decorator functions are not sourced,
exists('attribute') # FALSE
exists('html_wrap') # FALSE
# only decorated functions are sourced
print(selector1)
selector1(mtcars, 'mpg')
# format with bold tags
html_bold('make this bold')
# format with paragraph tags
html_paragraph("I'll make my report as if I told a story...")
Get Path of a Tinsel Example File
Description
tinsel_example
simplifies getting and returns the system path of an
example file included in the tinsel package. To list the names of all example
files use tinsel_examples
.
Usage
tinsel_example(path)
tinsel_examples()
Arguments
path |
Name of the example file. |
Examples
# list all example files
tinsel_examples()
# get the path of a specific example
tinsel_example('attributes.R')