generics
is designed to help package authors reduce
dependencies by providing a set of generic methods that can be imported.
For example, if a package author wanted to include a tidy
method for their object, they would have to import the
broom
package to do so. This would work but would
potentially increase the number of package dependencies required to
install and/or test the package.
To install generics
from CRAN, use:
install.packages("generics")
To install the development version, use:
install.packages("devtools")
::install_github("r-lib/generics") devtools
generics
is a simple, lightweight package that contains
S3 generics to be used by other packages. Some examples are:
library(generics)
#>
#> Attaching package: 'generics'
#> The following objects are masked from 'package:base':
#>
#> as.difftime, as.factor, as.ordered, intersect, is.element, setdiff,
#> setequal, union
fit#> function(object, ...) {
#> UseMethod("fit")
#> }
#> <bytecode: 0x7fe84f9e2620>
#> <environment: namespace:generics>
tidy#> function(x, ...) {
#> UseMethod("tidy")
#> }
#> <bytecode: 0x7fe85854b2d8>
#> <environment: namespace:generics>
To use generics
with your package, we recommend that you
import and re-export the generic(s) of interest. For example, if you
want to provide a method for the S3 explain()
method, you’d
using the following roxygen2
code:
#' @importFrom generics explain
#' @export
::explain generics
As an example, the recipes package defines
a number of tidy()
S3 methods by importing this package
(whereas it previously depended on broom
).
When searching for help on a method that is exported from
generics
by one or more packages, using
?method
will show entries for all exported methods. If the
version from generics
is selected, the Methods section
dynamically lists all specific methods exported by any loaded
packages.