[Bioc-devel] SetMethod to dispatch on class in unattached package
Martin Morgan
mtmorg@n@b|oc @end|ng |rom gm@||@com
Wed Jan 30 18:16:20 CET 2019
A simple approach is to suppress the message (I think this is pragmatic, rather than dumb __) about unknown class (along with DESCRIPTION Suggests: Seurat)
setGeneric("getGE", function(x) standardGeneric("getGE"))
suppressMessages({
setMethod("getGE", "seurat", function(x) Seurat::GetAssayData(x))
})
One fun thing to try is use hooks for package load; I would say that this is rarely used so may have surprising issues... Note the need to specify the location of the generic `PkgA::getGE` and that the method is defined in the global environment, rather than in the package environment, so would not have access to non-exported functions. The DESCRIPTION file has Suggests: Seurat
Something along the lines of
setGeneric("getGE", function(x) standardGeneric("getGE"))
.onLoad <-
function(...)
{
if ("Seurat" %in% loadedNamespaces()) {
setMethod(
getGE, "seurat",
function(x) Seurat::GetAssayData(x)
)
} else {
setHook(
packageEvent("Seurat", "onLoad"),
function(...) {
setMethod(
PkgA::getGE, "seurat",
function(x) Seurat::GetAssayData(x),
where = .GlobalEnv
)
}
)
}
}
Martin
On 1/29/19, 9:27 PM, "Bioc-devel on behalf of Brendan Innes" <bioc-devel-bounces using r-project.org on behalf of brendan.innes using mail.utoronto.ca> wrote:
Hi friendly Bioc gang! I'm struggling with what seems like a silly problem. I'm trying to write a simple wrapper S4 generic that accesses the data slot of various S4 objects (seurat and SingleCellExperiment objects). So the generic is:
setGeneric("getGE",function(x) standardGeneric("getGE"))
And the methods are:
setMethod("getGE","seurat",
function(x) Seurat::GetAssayData(x))
setMethod("getGE","SingleCellExperiment",
function(x) SingleCellExperiment::logcounts(x))
Problem is that when I install the package, I get the warning
> in method for �getGE� with signature �"seurat"�: no definition for class �seurat�
This isn't surprising, since Seurat isn't imported, but I don't want the user to have to import it if their data is in a SingleCellExperiment object. The function still seems to work fine if I attach Seurat and load a seurat object, so I'm tempted to just suppress the error (but darned if I know how to do that either). Before I do something so rash, does anyone have a suggestion for a less dumb way to do this?
Thanks so much!
Brendan
www.baderlab.org/BrendanInnes<http://www.baderlab.org/BrendanInnes>
[[alternative HTML version deleted]]
More information about the Bioc-devel
mailing list