Следующая функция в основном выполняет свою работу.Он использует utils::isS3stdGeneric
, указанный @Gregor для проверки обобщений S3, и methods::isGeneric
для S4.Основная проблема заключается в том, что он должен испортить пространство поиска, поэтому большая часть функции фактически загружает пакет и обеспечивает его корректное удаление с последующими зависимостями.
is.function.in.package.generic <- function(pkg, fun) {
old.search.pos <- search()[2]
on.exit({
while (attr(parent.env(.GlobalEnv), "name") != old.search.pos) {
detach()
}
})
suppressPackageStartupMessages(library(pkg, character.only = TRUE))
# Does the package actually have a roc function
t <- try(get(fun), silent=TRUE)
if (methods::is(t, "try-error")) {
warning(sprintf("Package %s doesn't seem to contain function %s", pkg, fun))
return(NA)
}
if (isS3stdGeneric(fun)) {
return(TRUE)
}
if (isGeneric(fun)) {
return(TRUE)
}
return(FALSE)
}
Кажется, что он работает нормально:
> is.function.in.package.generic("graphics", "plot") #S4
[1] TRUE
> is.function.in.package.generic("analogue", "roc") #S3
[1] TRUE
> is.function.in.package.generic("longROC", "roc") # Not generic
[1] TRUE
> is.function.in.package.generic("aucm", "roc") # No such function
[1] NA
Warning message:
In is.function.in.package.generic("aucm", "roc") :
Package aucm doesn't seem to contain function roc