Sorry if missing something obvious here... Is there any way to see in advance which S3 generic methods currently exist in the current environment (say <environment: R_GlobalEnv>
. A list of all current generic methods in base R
would do fine but I can't seem to find one.
The reason I'm asking is I'm defining some methods
for a class
and some of them will already be generic S3 methods so I'd like to know in advance without having to check each one manually.
For example:
isGeneric("mean")
>TRUE
isGeneric("quantile")
>FALSE
At the moment the closest I've come is:
ls(,all.names=TRUE)[sapply(ls(, all.names=TRUE), FUN=isGeneric)]
Which works if I already have a method defined (but doesn't give other potential generic methods) and gives the following error when I give it as a first command in a new R
session:
invalid subscript type 'list'
I doubt that many generic methods will be found within the global environment, they are more likely to be within the environment of a package.
Modifying the example from help ?Filter
(which lists all functions in the base package environment) as follows we can filter using isGeneric
:
Filter(isGeneric,ls(all.names=TRUE, env = baseenv()))
## [1] "-" "!=" "$" "$<-" "%%" "%/%" "&" "*"
## [9] "/" "[" "[[" "[[<-" "[<-" "^" "|" "+"
## [17] "<" "<=" "==" ">" ">=" "abs" "acos" "acosh"
## [25] "all" "any" "anyDuplicated" "as.character" "as.data.frame" "as.difftime" "as.double" "as.numeric"
## [33] "as.real" "asin" "asinh" "atan" "atanh" "body<-" "c" "ceiling"
## [41] "close" "cos" "cosh" "cummax" "cummin" "cumprod" "cumsum" "digamma"
## [49] "dim" "dim<-" "duplicated" "exp" "expm1" "floor" "format" "gamma"
## [57] "intersect" "kronecker" "length" "lgamma" "log" "log10" "log1p" "log2"
## [65] "max" "min" "names" "print" "prod" "range" "rep" "rev"
## [73] "round" "setdiff" "sign" "signif" "sin" "sinh" "sort" "sqrt"
## [81] "sum" "summary" "tan" "tanh" "trigamma" "trunc" "union" "unique"
If you need to find what package a function comes from use:
find('function')
In light of your comment: to search all packages on the search path for generic functions, use the following:
Filter(length,sapply(search(), function(x) {
Filter(isGeneric,ls(all.names=TRUE,env = as.environment(x)))
} ))
Note that this is wrapped in another Filter
statement (to remove elements where length==0
).
There is also the internal object .knownS3Generics
in the base
package environment that will also be useful.
Here is another method, using utils::isS3stdGeneric
in preference to methods::isGeneric
.
I used the following to get the functions in the base
package:
objs1 <- mget(ls("package:base"), inherits=TRUE)
funs1 <- Filter(is.function, objs)
Now remove those with where the body is null (primitives such as sum
) or is a symbol (dontCheck(x)
, force(x)
and identity(x)
all simply return x
):
genFuns0 <- sapply(
funs1,
function(X) {
if (!is.null(body(X)) & !is.symbol(body(X))) {
utils::isS3stdGeneric(X)
}
},
simplify=FALSE
)
Then
head(genFuns <- names(Filter(isTRUE, genFuns0)))
gives
[1] "all.equal" "anyDuplicated" "aperm" "as.array"
[5] "as.Date" "as.expression"
R version 3.6.3 (2020-02-29)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With