[Bioc-devel] Help with class lost after subsetting.
On 08/28/2018 11:46 AM, Herv? Pag?s wrote:
On 08/27/2018 11:01 PM, Martin Morgan wrote:
On 08/28/2018 12:19 AM, Charles Plessy wrote:
Dear Bioconductor developers, In the CAGEr package, I created a "CAGEexp" class that extends "MultiAssayExperiment" without adding new slots, in order to define generic functions that require CAGEr-specific contents in the colData slot. Unfortunately, when run in the development branch of Bioconductor, the CAGEexp objects lose their class when they are subsetted.? Here is an example:
CAGEr::exampleCAGEexp
A CAGEexp object of 4 listed (...)
CAGEr::exampleCAGEexp[,1]
A MultiAssayExperiment object of 4 listed (...) This breaks examples in the package, as well as existing code. I am lost on how to troubleshoot this.? May I ask for your help ?
I debugged this using first `selectMethod("[",
"MultiAssayExperiment")` and then `showMethod()` / `selectMethod()` to
arrive at `subsetByColData,MultiAssayExperiment,ANY-method`.
The problem is that this line
https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_waldronlab_MultiAssayExperiment_blob_master_R_subsetBy-2Dmethods.R-23L261&d=DwICAg&c=eRAMFD45gAfqt84VtBcfhQ&r=BK7q3XeAvimeWdGbWY_wJYbW0WYiZvSXAJJKaaPhzWA&m=BFHgkPpGkkRZx_me9V6pN2aTIxXYDgkUBG5jJTKLugc&s=6XrUMqkUrT5cepxjwAwSXVXdjOeyRdWAjdpGaasVqc0&e=
returns a MultiAssayExperiment; what it should do is probably closer
to the 'copy constructor' functionality of `initialize()`, along the
lines of
?? initialize(x, ExperimentList = ..., )
This could be opened as an issue on the MultiAssayExperiment github
repository; maybe Herve or Michael or others might comment on the best
implementation.
Yep. Personally I tend to prefer BiocGenerics:::replaceSlots() over initialize() because the former can be called with check=FALSE in order to skip a possibly expensive validation. So: ??? BiocGenerics:::replaceSlots(x ??????? ExperimentList = harmon[["experiments"]], ??????? colData = harmon[["colData"]], ??????? sampleMap = harmon[["sampleMap"]], ??????? metadata = metadata(x), ??????? check = FALSE) If you know that the replacement values are valid (because of the way you prepared them), then validation should not be needed. Also when only **some** of the slots are updated (which is not the case in the above example where all the slots are being replaced),
ERRATA: It seems that MultiAssayExperiment have one more slot, the "drops" slot, that the code above does not modify so this would be one more reason IMO to use BiocGenerics:::replaceSlots() instead of something like initialize(x, ExperimentList = ..., ) or new(class(x),ExperimentList = ..., ). H.
I find that the use of initialize() is misleading from a readability point of view. See https://urldefense.proofpoint.com/v2/url?u=https-3A__stat.ethz.ch_pipermail_bioc-2Ddevel_2017-2DSeptember_011496.html&d=DwIFaQ&c=eRAMFD45gAfqt84VtBcfhQ&r=BK7q3XeAvimeWdGbWY_wJYbW0WYiZvSXAJJKaaPhzWA&m=OlbCmHfOSsvIe5QU8cUQjnV7NeLHnJ9GndGatxMWmXQ&s=fV9PeZDYz9qEIxeLk00LcjpNNgzQy_kzi6aFEKBvlds&e= for a discussion about this about 1 year ago. H.
Martin
Best regards,
_______________________________________________ Bioc-devel at r-project.org mailing list https://urldefense.proofpoint.com/v2/url?u=https-3A__stat.ethz.ch_mailman_listinfo_bioc-2Ddevel&d=DwICAg&c=eRAMFD45gAfqt84VtBcfhQ&r=BK7q3XeAvimeWdGbWY_wJYbW0WYiZvSXAJJKaaPhzWA&m=BFHgkPpGkkRZx_me9V6pN2aTIxXYDgkUBG5jJTKLugc&s=Xa6tx2WwH603kmeR7WiV1PLMBM3myI5fUfjLL6WkMmU&e=
Herv? Pag?s Program in Computational Biology Division of Public Health Sciences Fred Hutchinson Cancer Research Center 1100 Fairview Ave. N, M1-B514 P.O. Box 19024 Seattle, WA 98109-1024 E-mail: hpages at fredhutch.org Phone: (206) 667-5791 Fax: (206) 667-1319