A drag, since hist(foo, plot=FALSE) acts as expected. I emulate this behavior for most of my code nowadays, not least since I often want to return something useful, whether plotted or not.
--t > On Oct 31, 2014, at 3:53 PM, "Ryan C. Thompson" <r...@thompsonclan.org> wrote: > > I'd just like to chime in that regardless of what approach is chosen, I > definitely would appreciate a way to get the plot data without actually > making the plot. I often end up reimplementing plots in ggplot so that I can > easily customize some aspect of them, so in such cases I need a way to just > get the plot data/coordinates. > > For example, if I have an edgeR DGEList and I want to get the X and Y > coordinates for the MDS plot, I need to do something like: > > dev.new() > mds.coords <- plotMDS(dge) > dev.off() > > which is kind of unfortunate. > > So I guess this is more a reminder to people implementing plots to also > implement a way to get the plot data. > > -Ryan > >> On Fri 31 Oct 2014 03:43:04 PM PDT, Steve Lianoglou wrote: >> Hi, >> >> On Fri, Oct 31, 2014 at 2:35 PM, Thomas Lin Pedersen >> <thomas...@gmail.com> wrote: >>> With regards to abstraction - I would personally much rather read and write >>> code that contained plotScores() and plotScree() etc. where the intend of >>> the code is clearly communicated, instead of relying on a plot() function >>> whose result is only known from experience. Trying to squeeze every kind of >>> visual output into the same plot generic seems artificial and constrained >>> to me. I totally agree on the plotPCA critique on the other hand... >> >> If we've bought a ticket to ride on Kevin's and Michael's (and whoever >> else) train of thought, wouldn't plot(pca(x), type='scree') or >> plot(pca(x), type='scores') be the preferred way to go ... for some >> definition of "preferable"? >> >> -steve >> >>> >>> Thomas >>> >>> >>>> On 31 Oct 2014, at 22:09, Michael Lawrence <lawrence.mich...@gene.com> >>>> wrote: >>>> >>>> I strongly agree with Kevin's position. plotPCA() represents two separate >>>> concerns in its very name: the computation and the rendering. Those need >>>> to be separated, at least behind the scenes. The syntax of plot(pca(x)) is >>>> preferable to plotPCA, because the structure of the operation is >>>> represented by in the expression itself, not just in a non-computable >>>> function name. >>>> >>>> With regard to how a plot,PCA should behave: there is always a tension >>>> between high-level and low-level APIs. In the end, we need multiple levels >>>> of abstraction. While high-level APIs sacrifice flexibility, we need them >>>> because they communicate the high-level *intent* of the user in the code >>>> itself (self-documenting code), and they enable reusability, which not >>>> only reduces redudant effort but also ensures consistency. Once our brains >>>> no longer need to parse low-level code, we can focus our mental power on >>>> correctness and efficiency. To design a high-level API, one needs to >>>> carefully analyze user requirements, i.e., the use cases. To choose the >>>> default behavior, one needs to rate the use cases by their prevalance, and >>>> by how closely they match the intuition-based expectations of the user. >>>> >>>> The fact that at least 9 packages are performing such a similar task seems >>>> to indicate that a common abstraction is warranted, but I am not sure if >>>> BiocGenerics is the appropriate place. >>>> >>>> Michael >>>> >>>> On Tue, Oct 21, 2014 at 12:54 AM, Thomas Dybdal Pedersen >>>> <thomas...@gmail.com <mailto:thomas...@gmail.com>> wrote: >>>> While I tend to agree with you that PCA is too big an operation to be >>>> hidden within a plotting function (MDS is an edge-case I would say), I >>>> can't see how we can ever reach a point where there is only one generic >>>> plot function. In the case of PCA there is a number of different >>>> plot-types that can all lay claim to the plot function of a PCA class, for >>>> instance scoreplot, scatterplot matrix of all scores, biplot, screeplot, >>>> accumulated R^2 barplot, leverage vs. distance-to-model... (you get the >>>> idea). So while having some very well-thought out classes for very common >>>> result types such as PCA, this class would still need a lot of different >>>> plot methods such as plotScores, plotScree etc (or plot(..., >>>> type='score'), but I don't find that very appealing). Expanding beyond PCA >>>> only muddles the water even more - there are very few interesting data >>>> structures that only have one visual representation to-rule-them-all... >>>> >>>> just my 2c >>>> >>>> best >>>> Thomas >>>> >>>> >>>>> Date: Mon, 20 Oct 2014 18:50:48 -0400 >>>>> From: Kevin Coombes <kevin.r.coom...@gmail.com >>>>> <mailto:kevin.r.coom...@gmail.com>> >>>>> >>>>> Well. I have two responses to that. >>>>> >>>>> First, I think it would be a lot better/easier for users if (most) >>>>> developers could make use of the same plot function for "basic" classes >>>>> like PCA. >>>>> >>>>> Second, if you think the basic PCA plotting routine needs enhancements, >>>>> you still have two options. On the one hand, you could (as you said) >>>>> try to convince the maintainer of PCA to add what you want. If it's >>>>> generally valuable, then he'd probably do it --- and other classes that >>>>> use it would benefit. On the other hand, if it really is a special >>>>> enhancement that only makes sense for your class, then you can derive a >>>>> class from the basic PCA class >>>>> setClass("mySpecialPCA", contains=c("PCA"), *other stuff here*) >>>>> and implement your own version of the "plot" generic for this class. >>>>> And you could tweak the "as.PCA" function so it returns an object of the >>>>> mySpecialPCA class. And the user could still just "plot" the result >>>>> without hacving to care what's happening behind the scenes. >>>>> >>>>>> On 10/20/2014 5:59 PM, Michael Love wrote: >>>>>> Ah, I see now. Personally, I don't think Bioconductor developers >>>>>> should have to agree on single plotting functions for basic classes >>>>>> like 'PCA' (because this logic applies equally to the situation of all >>>>>> Bioconductor developers agreeing on single MA-plot, a single >>>>>> variance-mean plot, etc). I think letting developers define their >>>>>> plotPCA makes contributions easier (I don't have to ask the owner of >>>>>> plot.PCA to incorporate something), even though it means we have a >>>>>> growing list of generics. >>>>>> >>>>>> Still you have a good point about splitting computation and plotting. >>>>>> In practice, we subset the rows so PCA is not laborious. >>>>>> >>>>>> >>>>>> On Mon, Oct 20, 2014 at 5:38 PM, Kevin Coombes >>>>>> <kevin.r.coom...@gmail.com <mailto:kevin.r.coom...@gmail.com> >>>>>> <mailto:kevin.r.coom...@gmail.com <mailto:kevin.r.coom...@gmail.com>>> >>>>>> wrote: >>>>>> >>>>>> Hi, >>>>>> >>>>>> I don't see how it needs more functions (as long as you can get >>>>>> developers to agree). Suppose that someone can define a reusable >>>>>> PCA class. This will contain a single "plot" generic function, >>>>>> defined once and reused by other classes. The existing "plotPCA" >>>>>> interface can also be implemented just once, in this class, as >>>>>> >>>>>> plotPCA <- function(object, ...) plot(as.PCA(object), ...) >>>>>> >>>>>> This can be exposed to users of your class through namespaces. >>>>>> Then the only thing a developer needs to implement in his own >>>>>> class is the single "as.PCA" function. And he/she would have >>>>>> already been rquired to implement this as part of the old >>>>>> "plotPCA" function. So it can be extracted from that, and the >>>>>> developer doesn't have to reimplement the visualization code from >>>>>> the PCA class. >>>>>> >>>>>> Best, >>>>>> Kevin >>>>>> >>>>>> >>>>>>> On 10/20/2014 5:15 PM, davide risso wrote: >>>>>>> Hi Kevin, >>>>>>> >>>>>>> I see your points and I agree (especially for the specific case >>>>>>> of plotPCA that involves some non trivial computations). >>>>>>> >>>>>>> On the other hand, having a wrapper function that starting from >>>>>>> the "raw" data gives you a pretty picture (with virtually zero >>>>>>> effort by the user) using a sensible choice of parameters that >>>>>>> are more or less OK for RNA-seq data is useful for practitioners >>>>>>> that just want to look for patterns in the data. >>>>>>> >>>>>>> I guess it would be the same to have a PCA method for each of the >>>>>>> objects and then using the plot method on those new objects, but >>>>>>> that would just create a lot more objects and functions than the >>>>>>> current approach (like Mike was saying). >>>>>>> >>>>>>> Your "as.pca" or "performPCA" approach would be definitely better >>>>>>> if all the different methods would create objects of the *same* >>>>>>> PCA class, but since we are talking about different packages, I >>>>>>> don't know how easy it would be to coordinate. But perhaps this >>>>>>> is the way we should go. >>>>>>> >>>>>>> Best, >>>>>>> davide >>>>>>> >>>>>>> >>>>>>> >>>>>>> On Mon, Oct 20, 2014 at 1:26 PM, Kevin Coombes >>>>>>> <kevin.r.coom...@gmail.com <mailto:kevin.r.coom...@gmail.com> >>>>>>> <mailto:kevin.r.coom...@gmail.com <mailto:kevin.r.coom...@gmail.com>>> >>>>>>> wrote: >>>>>>> >>>>>>> Hi, >>>>>>> >>>>>>> It depends. >>>>>>> >>>>>>> The "traditional" R approach to these matters is that you (a) >>>>>>> first perform some sort of an analysis and save the results >>>>>>> as an object and then (b) show or plot what you got. It is >>>>>>> part (b) that tends to be really generic, and (in my opinion) >>>>>>> should have really generic names -- like "show" or "plot" or >>>>>>> "hist" or "image". >>>>>>> >>>>>>> With PCA in particular, you usually have to perform a bunch >>>>>>> of computations in order to get the principal components from >>>>>>> some part of the data. As I understand it now, these >>>>>>> computations are performed along the way as part of the >>>>>>> various "plotPCA" functions. The "R way" to do this would be >>>>>>> something like >>>>>>> pca <- performPCA(mySpecialObject) # or >>>>>>> as.PCA(mySpecialObject) >>>>>>> plot(pca) # to get the scatter plot >>>>>>> This apporach has the user-friendly advantage that you can >>>>>>> tweak the plot (in terms of colors, symbols, ranges, titles, >>>>>>> etc) without having to recompute the principal components >>>>>>> every time. (I often find myself re-plotting the same PCA >>>>>>> several times, with different colors or symbols for different >>>>>>> factrors associated with the samples.) In addition, you could >>>>>>> then also do something like >>>>>>> screeplot(pca) >>>>>>> to get a plot of the percentages of variance explained. >>>>>>> >>>>>>> My own feeling is that if the object doesn't know what to do >>>>>>> when you tell it to "plot" itself, then you haven't got the >>>>>>> right abstraction. >>>>>>> >>>>>>> You may still end up needing generics for each kind of >>>>>>> computation you want to perform (PCA, RLE, MA, etc), which is >>>>>>> why I suggested an "as.PCA" function. After all, "as" is >>>>>>> already pretty generic. In the long run, l this would herlp >>>>>>> BioConductor developers, since they wouldn't all have to >>>>>>> reimplement the visualization code; they would just have to >>>>>>> figure out how to convert their own object into a PCA or RLE >>>>>>> or MA object. >>>>>>> >>>>>>> And I know that this "plotWhatever" approach is used >>>>>>> elsewhere in BioConductor, and it has always bothered me. It >>>>>>> just seemed that a post suggesting a new generic function >>>>>>> provided a reasonable opportunity to point out that there >>>>>>> might be a better way. >>>>>>> >>>>>>> Best, >>>>>>> Kevin >>>>>>> >>>>>>> PS: My own "ClassDicsovery" package, which is available from >>>>>>> RForge via >>>>>>> **|install.packages("ClassDiscovery", >>>>>>> repos="http://R-Forge.R-project.org >>>>>>> <http://r-forge.r-project.org/>" >>>>>>> <http://R-Forge.R-project.org >>>>>>> <http://r-forge.r-project.org/>>)|** >>>>>>> includes a "SamplePCA" class that does something roughly >>>>>>> similar to this for microarrays. >>>>>>> >>>>>>> PPS (off-topic): The worst offender in base R -- because it >>>>>>> doesn't use this "typical" approch -- is the "heatmap" >>>>>>> function. Having tried to teach this function in several >>>>>>> different classes, I have come to the conclusion that it is >>>>>>> basically unusable by mortals. And I think the problem is >>>>>>> that it tries to combine too many steps -- clustering rows, >>>>>>> clustering columns, scaling, visualization -- all in a single >>>>>>> fiunction >>>>>>> >>>>>>> >>>>>>>> On 10/20/2014 3:47 PM, davide risso wrote: >>>>>>>> Hi Kevin, >>>>>>>> >>>>>>>> I don't agree. In the case of EDASeq (as I suppose it is the >>>>>>>> case for DESeq/DESeq2) plotting the principal components of >>>>>>>> the count matrix is only one of possible exploratory plots >>>>>>>> (RLE plots, MA plots, etc.). >>>>>>>> So, in my opinion, it makes more sense from an object >>>>>>>> oriented point of view to have multiple plotting methods for >>>>>>>> a single "RNA-seq experiment" object. >>>>>>>> >>>>>>>> In addition, this is the same strategy adopted elsewhere in >>>>>>>> Bioconductor, e.g., for the plotMA method. >>>>>>>> >>>>>>>> Just my two cents. >>>>>>>> >>>>>>>> Best, >>>>>>>> davide >>>>>>>> >>>>>>>> On Mon, Oct 20, 2014 at 11:30 AM, Kevin Coombes >>>>>>>> <kevin.r.coom...@gmail.com <mailto:kevin.r.coom...@gmail.com> >>>>>>>> <mailto:kevin.r.coom...@gmail.com >>>>>>>> <mailto:kevin.r.coom...@gmail.com>>> wrote: >>>>>>>> >>>>>>>> I understand that breaking code is a problem, and that >>>>>>>> is admittedly the main reason not to immediately adopt >>>>>>>> my suggestion. >>>>>>>> >>>>>>>> But as a purely logical exercise, creating a "PCA" >>>>>>>> object X or something similar and using either >>>>>>>> plot(X) >>>>>>>> or >>>>>>>> plot(as.PCA(mySpecialObject)) >>>>>>>> is a much more sensible use of object-oriented >>>>>>>> programming/design. This requires no new generics (to >>>>>>>> write or to learn). >>>>>>>> >>>>>>>> And you could use it to transition away from the current >>>>>>>> system by convincing the various package maintainers to >>>>>>>> re-implement plotPCA as follows: >>>>>>>> >>>>>>>> plotPCA <- function(object, ...) { >>>>>>>> plot(as.PCA(object), ...) >>>>>>>> } >>>>>>>> >>>>>>>> This would be relatively easy to eventually deprecate >>>>>>>> and teach users to switch to the alternative. >>>>>>>> >>>>>>>> >>>>>>>>> On 10/20/2014 1:07 PM, Michael Love wrote: >>>>>>>>> hi Kevin, >>>>>>>>> >>>>>>>>> that would imply there is only one way to plot an >>>>>>>>> object of a given class. Additionally, it would break a >>>>>>>>> lot of code.? >>>>>>>>> >>>>>>>>> best, >>>>>>>>> >>>>>>>>> Mike >>>>>>>>> >>>>>>>>> On Mon, Oct 20, 2014 at 12:50 PM, Kevin Coombes >>>>>>>>> <kevin.r.coom...@gmail.com >>>>>>>>> <mailto:kevin.r.coom...@gmail.com> >>>>>>>>> <mailto:kevin.r.coom...@gmail.com >>>>>>>>> <mailto:kevin.r.coom...@gmail.com>>> wrote: >>>>>>>>> >>>>>>>>> But shouldn't they all really just be named "plot" >>>>>>>>> for the appropriate objects? In which case, there >>>>>>>>> would already be a perfectly good generic.... >>>>>>>>> >>>>>>>>> On Oct 20, 2014 10:27 AM, "Michael Love" >>>>>>>>> <michaelisaiahl...@gmail.com >>>>>>>>> <mailto:michaelisaiahl...@gmail.com> >>>>>>>>> <mailto:michaelisaiahl...@gmail.com >>>>>>>>> <mailto:michaelisaiahl...@gmail.com>>> wrote: >>>>>>>>> >>>>>>>>> I noticed that 'plotPCA' functions are defined >>>>>>>>> in EDASeq, DESeq2, DESeq, >>>>>>>>> affycoretools, Rcade, facopy, CopyNumber450k, >>>>>>>>> netresponse, MAIT (maybe >>>>>>>>> more). >>>>>>>>> >>>>>>>>> Sounds like a case for BiocGenerics. >>>>>>>>> >>>>>>>>> best, >>>>>>>>> >>>>>>>>> Mike >>>>>>>>> >>>>>>>>> [[alternative HTML version deleted]] >>>>>>>>> >>>>>>>>> _______________________________________________ >>>>>>>>> Bioc-devel@r-project.org >>>>>>>>> <mailto:Bioc-devel@r-project.org> >>>>>>>>> <mailto:Bioc-devel@r-project.org >>>>>>>>> <mailto:Bioc-devel@r-project.org>> mailing list >>>>>>>>> https://stat.ethz.ch/mailman/listinfo/bioc-devel >>>>>>>>> <https://stat.ethz.ch/mailman/listinfo/bioc-devel> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> ------------------------------------------------------------------------ >>>>>>>> <http://www.avast.com/ <http://www.avast.com/>> >>>>>>>> >>>>>>>> This email is free from viruses and malware because >>>>>>>> avast! Antivirus <http://www.avast.com/ >>>>>>>> <http://www.avast.com/>> protection is >>>>>>>> active. >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> Davide Risso, PhD >>>>>>>> Post Doctoral Scholar >>>>>>>> Division of Biostatistics >>>>>>>> School of Public Health >>>>>>>> University of California, Berkeley >>>>>>>> 344 Li Ka Shing Center, #3370 >>>>>>>> Berkeley, CA 94720-3370 >>>>>>>> E-mail: davide.ri...@berkeley.edu >>>>>>>> <mailto:davide.ri...@berkeley.edu> >>>>>>>> <mailto:davide.ri...@berkeley.edu >>>>>>>> <mailto:davide.ri...@berkeley.edu>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> ------------------------------------------------------------------------ >>>>>>> <http://www.avast.com/ <http://www.avast.com/>> >>>>>>> >>>>>>> This email is free from viruses and malware because avast! >>>>>>> Antivirus <http://www.avast.com/ <http://www.avast.com/>> >>>>>>> protection is active. >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Davide Risso, PhD >>>>>>> Post Doctoral Scholar >>>>>>> Division of Biostatistics >>>>>>> School of Public Health >>>>>>> University of California, Berkeley >>>>>>> 344 Li Ka Shing Center, #3370 >>>>>>> Berkeley, CA 94720-3370 >>>>>>> E-mail: davide.ri...@berkeley.edu <mailto:davide.ri...@berkeley.edu> >>>>>>> <mailto:davide.ri...@berkeley.edu <mailto:davide.ri...@berkeley.edu>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> ------------------------------------------------------------------------ >>>>>> <http://www.avast.com/ <http://www.avast.com/>> >>>>>> >>>>>> This email is free from viruses and malware because avast! >>>>>> Antivirus <http://www.avast.com/ <http://www.avast.com/>> protection >>>>>> is active. >>>>> >>>>> >>>>> >>>>> --- >>>>> This email is free from viruses and malware because avast! Antivirus >>>>> protection is active. >>>>> >>>>> >>>>> [[alternative HTML version deleted]] >>>>> >>>>> >>>>> >>>>> ------------------------------ >>>>> >>>>> _______________________________________________ >>>>> Bioc-devel mailing list >>>>> Bioc-devel@r-project.org <mailto:Bioc-devel@r-project.org> >>>>> https://stat.ethz.ch/mailman/listinfo/bioc-devel >>>>> <https://stat.ethz.ch/mailman/listinfo/bioc-devel> >>>>> >>>>> >>>>> End of Bioc-devel Digest, Vol 127, Issue 43 >>>>> ******************************************* >>>> >>>> _______________________________________________ >>>> Bioc-devel@r-project.org <mailto:Bioc-devel@r-project.org> mailing list >>>> https://stat.ethz.ch/mailman/listinfo/bioc-devel >>>> <https://stat.ethz.ch/mailman/listinfo/bioc-devel> >>> >>> >>> [[alternative HTML version deleted]] >>> >>> _______________________________________________ >>> Bioc-devel@r-project.org mailing list >>> https://stat.ethz.ch/mailman/listinfo/bioc-devel > > _______________________________________________ > Bioc-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/bioc-devel _______________________________________________ Bioc-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/bioc-devel