The goal of typos
is to provide a flexible warning when commonly
mis-typed functions are called. Functions with typing errors will still
be evaluated and a warning will be output. It also provides the user
with a convenient function to define their own typos.
You can install the development version of typos
from
GitHub with:
# install.packages("devtools")
devtools::install_github("MyKo101/typos")
For example, without typos
installed, mistyping the functions
names()
as nameS()
will throw an error.
nameS(mtcars)
#> Warning: Typo of "names()" detected in "nameS()"
#> [1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear" "carb"
But, with typos
, the function is still evaluated, and rather than an
Error, a Warning is produced.
library(typos)
nameS(mtcars)
#> Warning: Typo of "names()" detected in "nameS()"
#> [1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear" "carb"
The key to typo
is the .typo()
function. To generate a typo, we use
the following syntax:
<incorrect spelling> <- .typo(<correct spelling>)
For example, the above nameS
typo is generated with
nameS <- .typo(names)
The way .typo()
works is to generate a wrapper function around the
correctly spelled function. This wrapper function sends a warning to the
user, but still evaluates the “proper” function.
The wrapper function, nameS
looks like this:
nameS
#> function(...)
#> {
#> requireNamespace("base",quietly=T)
#> .call <- match.call()
#> .incorrect_call <- as_name(.call[[1]])
#> .call[[1]] <- quote(names)
#> .typo_alert("names",.incorrect_call)
#> eval_tidy(.call,env=rlang::caller_env())
#> }
#> <environment: namespace:typos>
Notice that all the arguments passed to nameS(...)
are forwarded on to
names(...)
As well as the correctly spelled function, the .typo()
function can
take a .package
argument (this will always be the second unnamed
argument, so code can be neater). By default, this will be the base
package, but any other package will need to be specified (this
includes default packages like stats
).
Rnorm <- .typo(rnorm,stats)
Within the wrapper function, this changes two things. The argument
passed to requireNamespace()
will match this package, as will the
“proper” function call
Rnorm
#> function(...)
#> {
#> requireNamespace("stats",quietly=T)
#> .call <- match.call()
#> .incorrect_call <- as_name(.call[[1]])
#> .call[[1]] <- quote(rnorm)
#> .typo_alert("rnorm",.incorrect_call)
#> eval_tidy(.call,env=rlang::caller_env())
#> }
#> <environment: 0x00000242b5f8fa40>
Caution should be used if the misspelled version of your function
already exists as a function in it’s own right. The .typo()
will
overwrite the other “correct” function with the new typo function. For
this reason, it is recommended that typos
be the first package loaded
to ensure functions loaded in other packages can overwrite the Exported
typos provided here.
Please note that the typos project is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms.