[Bioc-devel] NAMESPACE best practices
Kasper Daniel Hansen
k@@perd@n|e|h@n@en @end|ng |rom gm@||@com
Thu May 26 03:02:51 CEST 2022
I agree with Herve: packages that define objects that the user actually
interacts with, should IMO be Depends.
import vs importFrom depends a bit on which package and how many functions
I use. There is a limit where I'm just like screw it, I'll get everything.
codetoolsBioC has a useful function writeNamespace().
Best,
Kasper
On Wed, May 25, 2022 at 5:56 AM Alexander Blume <alex.gos90 using gmail.com>
wrote:
> Hi Hervé,
>
> Thank you so much for your detailed response! These are some really helpful
> advices.
> I will take care of the missing imports and leave the Depends field as is.
> You are right, in the end, the usability is most important.
>
> Best,
> Alex
>
> Sent from mobile.
>
> Hervé Pagès <hpages.on.github using gmail.com> schrieb am Di., 24. Mai 2022,
> 19:43:
>
> > Hi Alex,
> >
> > On 24/05/2022 03:56, Alexander Blume wrote:
> > > Dear All,
> > >
> > > I recently took over maintenance of the “fastseg” package (
> > http://bioconductor.org/packages/3.16/bioc/html/fastseg.html) and after
> > fixing the issues recommended by `R CMD Check` I wanted to optimize the
> > package's NAMESPACE file and the Depends/Imports given in the DESCRIPTION
> > file.
> > >
> > > Replacing the generic complete `import` of dependent packages with more
> > fine-grained `importFrom` calls is rather obvious.
> > > However, I was wondering if there are any reasons that speak against
> > doing so?
> >
> > In my experience doing selective imports for core packages like methods,
> > BiocGenerics, S4Vectors, IRanges, and GenomicRanges, is almost never
> > worth it. It's just one more maintenance burden for virtually zero
> > benefits.
> >
> > However, the following 'R CMD check' NOTES:
> >
> > Namespace in Imports field not imported from: ‘stats’
> >
> > and
> >
> > Consider adding
> > importFrom("grDevices", "dev.cur", "dev.interactive", "dev.new")
> >
> > reveal real problems that should be addressed.
> >
> > >
> > > Concerning the DESCRIPTION file, given that the used functions were
> > already specified in the NAMESPACE I was planning to edit the DESCRIPTION
> > file and move the “GenomicRanges” and “Biobase” dependencies from Depends
> > to Imports.
> > > In the package, the Biobase functions are used to query supported
> > ExpressionSet objects, while GenomicRanges is used to support Granges
> > objects and create the final output as Granges object.
> > > Is it legit to have GenomicRanges “only" as Imports, even if the main
> > function's output is in GRanges format?
> >
> > The consequence of moving GenomicRanges from Depends to Imports is that
> > the basic GRanges functionalities would no longer be available to your
> > users so it would feel like you're returning objects that "don't work".
> > Unfortunately I see many Bioconductor packages doing similar things e.g.
> > some packages return SummarizedExperiment derivatives but don't depend
> > on the SummarizedExperiment package (they only import it). As a
> > consequence basic things like assay() or colData() don't work on the
> > object.
> >
> > Here is a concrete example:
> >
> > library(AUCell)
> > exprMatrix <- cbind(cell1=100*4:0, cell2=c(500, 0, 90, 0, 750))
> > rownames(exprMatrix) <- sprintf("gene%02d", seq_len(nrow(exprMatrix)))
> > rankings <- AUCell_buildRankings(exprMatrix, plotStats=FALSE,
> > verbose=FALSE) # a SummarizedExperiment derivative
> >
> > assay(rankings)
> > # Error in assay(rankings) : could not find function "assay"
> >
> > colData(rankings)
> > # Error in colData(rankings) : could not find function "colData"
> >
> > library(SummarizedExperiment)
> > assay(rankings)
> > # cells
> > # genes cell1 cell2
> > # gene01 1 2
> > # gene02 2 4
> > # gene03 3 3
> > # gene04 4 5
> > # gene05 5 1
> >
> > >
> > > I want to keep the “Depends” field as small as possible to not pollute
> > downstream packages to attach everything and mask other functions.
> >
> > Keeping Depends as small as possible is definitely something to aim for,
> > as long as your users can still "operate" on the objects that you expose
> > to them. For example your users should not need to guess what package to
> > load before they can use the accessor functions defined for the object
> > your returned to them.
> >
> > > Is this reasonable, or should I just import “GenomicRanges” plus all
> > required packages from the beginning and live with it? I hope there are
> > some general guidelines to follow.
> >
> > Definitely keep GenomicRanges in Depends.
> >
> > Cheers,
> >
> > H.
> >
> >
> > >
> > > Best
> > > Alex
> > >
> > > _______________________________________________
> > > Bioc-devel using r-project.org mailing list
> > > https://stat.ethz.ch/mailman/listinfo/bioc-devel
> >
> > --
> > Hervé Pagès
> >
> > Bioconductor Core Team
> > hpages.on.github using gmail.com
> >
> >
>
> [[alternative HTML version deleted]]
>
> _______________________________________________
> Bioc-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/bioc-devel
>
--
Best,
Kasper
[[alternative HTML version deleted]]
More information about the Bioc-devel
mailing list