Title: | Helpers for 'OOP' in R |
Version: | 1.0.1 |
Description: | A collection of helper functions designed to help you to better understand object oriented programming in R, particularly using 'S3'. |
License: | GPL-3 |
URL: | https://github.com/r-lib/sloop, https://sloop.r-lib.org |
BugReports: | https://github.com/r-lib/sloop/issues |
Depends: | R (≥ 3.3) |
Imports: | codetools, crayon, methods, purrr, rlang, tibble (≥ 2.0.1) |
Suggests: | covr, testthat |
Encoding: | UTF-8 |
LazyData: | true |
RoxygenNote: | 6.1.1 |
NeedsCompilation: | no |
Packaged: | 2019-02-17 15:12:32 UTC; hadley |
Author: | Hadley Wickham [aut, cre], RStudio [cph] |
Maintainer: | Hadley Wickham <hadley@rstudio.com> |
Repository: | CRAN |
Date/Publication: | 2019-02-17 15:30:03 UTC |
Determine function type.
Description
This function figures out whether the input function is a regular/primitive/internal function, a internal/S3/S4 generic, or a S3/S4/RC method. This is function is slightly simplified as it's possible for a method from one class to be a generic for another class, but that seems like such a bad idea that hopefully no one has done it.
Usage
ftype(f)
Arguments
f |
unquoted function name |
Value
a character of vector of length 1 or 2.
Examples
ftype(`%in%`)
ftype(sum)
ftype(t.data.frame)
ftype(t.test) # Tricky!
ftype(writeLines)
ftype(unlist)
Determine if a function is an S3 generic or S3 method.
Description
is_s3_generic()
compares name checks for both internal and regular
generics. is_s3_method()
builds names of all possible generics for that
function and then checks if any of them actually is a generic.
Usage
is_s3_generic(fname, env = parent.frame())
is_s3_method(fname, env = parent.frame())
Arguments
fname |
Name of function as a string. Need name of function because it's impossible to determine whether or not a function is a S3 method based only on its contents. |
env |
Environment to search in. |
Examples
is_s3_generic("mean")
is_s3_generic("sum")
is_s3_generic("[[")
is_s3_generic("unlist")
is_s3_generic("runif")
is_s3_method("t.data.frame")
is_s3_method("t.test") # Just tricking!
is_s3_method("as.data.frame")
is_s3_method("mean.Date")
Determine the type of an object
Description
Tells you if you're dealing with an base, S3, S4, RC, or R6 object.
Usage
otype(x)
Arguments
x |
An object |
Examples
otype(1:10)
otype(mtcars)
Compute the S3 class of an object
Description
Compared to class()
, this always returns the class vector that is
used for dispatch. This is most important for objects where the
class attribute has not been set.
Usage
s3_class(x)
Arguments
x |
A primitive type |
Examples
s3_class(NULL)
s3_class(logical())
s3_class(integer())
s3_class(numeric())
s3_class(character())
s3_class(matrix())
s3_class(matrix(1))
s3_class(array())
s3_class(array(1))
Illustrate S3 dispatch
Description
s3_dispatch()
prints a list of all possible function names that will be
considered for method dispatch. There are four possible states:
-
=>
method exists and is found byUseMethod()
. -
->
method exists and is used byNextMethod()
. -
*
method exists but is not used. Nothing (and greyed out in console): method does not exist.
Learn more at https://adv-r.hadley.nz/s3.html.
Usage
s3_dispatch(call, env = parent.frame())
Arguments
call |
Example call to S3 method |
env |
Environment in which to evaluate call |
Examples
x <- Sys.time()
s3_dispatch(print(x))
s3_dispatch(is.numeric(x))
s3_dispatch(as.Date(x))
s3_dispatch(sum(x))
# Internal vs. regular generic
x1 <- 1
x2 <- structure(2, class = "double")
my_length <- function(x) UseMethod("my_length")
s3_dispatch(my_length(x1))
s3_dispatch(my_length(x2))
length.double <- function(x) 10
s3_dispatch(length(x1))
s3_dispatch(length(x2))
Find S3 method from its name
Description
Find S3 method from its name
Usage
s3_get_method(name)
Arguments
name |
A string or unquoted symbol |
Value
A function, or an error stating why the method could not be found
Examples
s3_get_method(mean.Date)
s3_get_method(weighted.mean.Date)
List methods for a S3 or S4 generic (or class)
Description
Returns information about all methods belong to a generic or a class.
In S3 and S4, methods belong to a generic, but it is often useful to see what
generics have been provided methods for a given class. These are
wrappers around utils::methods()
, which returns a lot of useful information
in an attribute.
Usage
s3_methods_class(x)
s3_methods_generic(x)
s4_methods_class(x)
s4_methods_generic(x)
Arguments
x |
Name of class or generic |
Value
A tibble with columns generic
, visible
, class
, visible
,
and source
.
Examples
s3_methods_class("Date")
s3_methods_generic("anova")
s4_methods_class("Date")
s4_methods_generic("anova")