[BioC] limma topTable question

Cyrus Harmon ch-bioc at bobobeach.com
Tue Apr 5 06:37:05 CEST 2005

On Apr 4, 2005, at 8:14 PM, Sean Davis wrote:

> The beauty of R and BioConductor is that YOU can modify option M:
> If you type topTable (without any parentheses or arguments), you will 
> see that topTable is a VERY thin wrapper around a call to the function 
> toptable. If you do the same for toptable (type it without any 
> parentheses or arguments), you will see about half way down the 
> definition of the function a line that looks like:
> ord <- switch(sort.by, M=(order(abs(M), decreasing=TRUE), ....

Indeed. Thanks for pointing this out. This is certainly quicker than my 
usual approach of finding the digging up the source file and finding 
the function definition in situ. Not quite as handy as M-. in SLIME (an 
emacs-based IDE/debugger for common lisp) but very nice.

> You can make a copy of toptable called my.toptable by:
> my.toptable <- toptable
> Then, change the order for 'M' in my.toptable to be:
> ord <- switch(sort.by, M=(order(M, decreasing=TRUE),....

What do you mean by "change the order ... in my.toptable? I get the 
obvious part, but the question is more of a mechanical one, having done 
my.toptable <- toptable? How do I edit the ord <- line? Clearly, I can 
put the function definition in an emacs/ESS buffer and eval the 
function def, but is there a better way to do this? The REPL is very 
nice, but the model of eval'ing function defs or regions one at a time 
in emacs buffers seems somewhat cloddish. Back to the parallel, with 
slime, is there a nice way to make this change take effect? It seems 
that the problem is magnified if I'm trying to develop an R extension 
as I have to do R CMD INSTALL in order to get the change to take effect 
in the place I eventually want to use it. I realize I've gone totally 
off of the topic from the original question, but if the preferred model 
of tweaking packages like this is as you've described, I feel like I 
must be missing something about the mechanics of writing and eval'ing R 

> If you make a copy of topTable called my.topTable by:
> my.topTable <- topTable
> and change it so that it calls my.toptable instead of toptable, you 
> now have your own function called my.topTable that does what you want. 
>  You can of course make any other changes to the functions that you 
> want--add your own options, etc.  The simple task of looking at 
> others' code is quite powerful when dealing with issues like the one 
> you bring up.  I would encourage all who use bioconductor and R to try 
> it whenever possible; even if it doesn't all make sense, it is a very 
> good way to learn.

Sure, but I'd hope that package maintainers were open to well-written 
and documented patches that added the functionality to the library 
itself, rather than having tons of local copies of possibly out of date 
lying code. I suppose, going back to my previous question, I could 
store my.toptable.diff and apply the diff on the fly and iff the patch 
succeeds eval a modified my.toptable, but that seems a bit hokey.

>> (Combining my question and my gripe, a sort by "m" that didn't do 
>> abs(M) would seem useful to me, but perhaps I'm missing something.)
> If you are not typically a programmer in bioconductor, this seems like 
> a good chance to try your hand at it.  If you get something that you 
> like better than what Gordon has offered in Limma, send him the 
> modified code. He, like most of bioconductor/R developers, is 
> remarkably receptive and responsive to criticism/improvements.

This is great to hear. I feel like I'm having trouble figuring out how 
to develop mid-size projects in R. Clearly, typing R commands straight 
into the REPL is a nice way to play around, and clearly the R extension 
mechanism is a great way to package up R extensions for distribution, 
but for developing my own mid-size R packages, I'm still unclear on 
reasonable idioms for putting together my own mid-size projects. So far 
the best I've come up with is local packages that still need to be R 
CMD INSTALL'ed, but to a local directory, and then 
library(lib.loc=<some-nice-local-path>) in my scripts, but this topic 
has probably been previously covered ad nauseum. Time to go digging 
through the docs and r-help archives.

Thanks for your thoughtful reply,


More information about the Bioconductor mailing list