[Bioc-devel] Best Practices for Renaming S4 Slots

Hervé Pagès hp@ge@@on@g|thub @end|ng |rom gm@||@com
Fri Oct 15 18:38:55 CEST 2021


Hi Chris,

There was some formatting issues with my previous answer so I'm sending 
it again. Hopefully this time the formatting is better. See below.

On 14/10/2021 13:08, Chris Eeles wrote:
> Hello BioC community,
> 
> I am the lead developer for the CoreGx, PharmacoGx, RadioGx and ToxicoGx packages. We have recently been working on major updates to the structure of a CoreSet, which is inherited by the main class in all three of the other packages listed.
> 
> While making these changes, we would like to rename some CoreSet slots to increase the amount of code that can be refactored into CoreGx, simplifying maintenance and development of inheriting packages in the future.
> 
> The slot names and their accessors will be made more generic, for example the 'cell' slot will become 'sample' to allow a CoreSet derived class to store Biological model systems other than cancer cell lines. Similarly, 'drug' or 'radiation' slots in inheriting packages will be replaced with a 'treatment' slot in the CoreSet. This will allow us to simplify inheritance, removing much redundant code from the inheriting packages and setting us up to integrate other lab packages, such as Xeva for PDX models, into the general CoreSet infrastructure.
> 
> I took a brief look through the Bioconductor developer documentation but didn't see anything talking about best practices for renaming slots.
> 
> It is easy enough to make the code changes, but my major concern is being able to update existing objects from these packages to use the new slot names.
> 
> I am aware of the updateObject function in BiocGenerics, but tried using it to update some example data in CoreGx without success.
> 
> Is this the proper function to use when you wish to update an S4 object whose class definition has been modified? If not, is there existing infrastructure for accomplishing this task?

Yes updateObject() is the proper function to use but the function has no 
way to guess how to fix your objects. The way you tell it what to do is 
by implementing methods for your objects.

For example if you renamed the 'cell' slot -> 'sample', your 
updateObject() method will be something like this:


setMethod("updateObject", "CoreSet",
     function(object, ..., verbose=FALSE)
     {
         ## The "cell" slot was renamed -> "sample" in CoreGx_1.7.1.
         if (.hasSlot(object, "cell")) {
             object <- new("CoreSet",
                           sensitivity=object using sensitivity,
                           annotation=object using annotation,
                           molecularProfiles=object using molecularProfiles,
                           sample=object using cell,
                           datasetType=object using datasetType,
                           perturbation=object using perturbation,
                           curation=object using curation)
             return(object)
         }
         object
     }
)

The best time to do this internal renaming is at the beginning of the 
BioC 3.15 development cycle (i.e. right after the 3.14 release).

If in the future, other slots get renamed or added, you'll need to 
modify the updateObject() method above like this:

setMethod("updateObject", "CoreSet",
     function(object, ..., verbose=FALSE)
     {
         ## The "cell" slot was renamed -> "sample" in CoreGx_1.7.1.
         if (.hasSlot(object, "cell")) {
             object <- new("CoreSet",
                           sensitivity=object using sensitivity,
                           annotation=object using annotation,
                           molecularProfiles=object using molecularProfiles,
                           sample=object using cell,
                           datasetType=object using datasetType,
                           perturbation=object using perturbation,
                           titi=object using curation)  # use "titi" here too!
             return(object)
         }
         ## The "curation" slot was renamed -> "titi" in CoreGx_1.9.1.
         if (.hasSlot(object, "curation")) {
             object <- new("CoreSet",
                           sensitivity=object using sensitivity,
                           annotation=object using annotation,
                           molecularProfiles=object using molecularProfiles,
                           sample=object using sample,  # use "sample" here!
                           datasetType=object using datasetType,
                           perturbation=object using perturbation,
                           titi=object using curation)
             return(object)
         }
         object
     }
)

And so on...

Hope this helps,
H.


> 
> Any tips for implementing slot renaming, as well as links to existing documentation or articles on the topic would be appreciated.
> 
> Best,
> ---
> Christopher Eeles
> Software Developer
> BHK Laboratory<https://nam05.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.bhklab.ca%2F&data=02%7C01%7Ctao.qing%40yale.edu%7Ce130a2d3267b46a945ab08d79f7660ad%7Cdd8cbebb21394df8b4114e3e87abeb5c%7C0%7C0%7C637153203084194682&sdata=nGXPfLnlbcaLQdDOHFDmp4lZ7lD9H29uFeVCAqjT9Ds%3D&reserved=0>
> Princess Margaret Cancer Centre<https://nam05.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.pmgenomics.ca%2Fpmgenomics%2F&data=02%7C01%7Ctao.qing%40yale.edu%7Ce130a2d3267b46a945ab08d79f7660ad%7Cdd8cbebb21394df8b4114e3e87abeb5c%7C0%7C0%7C637153203084194682&sdata=b2ZjA%2FPDKjTZmAWGbnQAY1SjVtCDQGQmXu2Thz%2FXQkI%3D&reserved=0>
> University Health Network<https://nam05.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.uhn.ca%2F&data=02%7C01%7Ctao.qing%40yale.edu%7Ce130a2d3267b46a945ab08d79f7660ad%7Cdd8cbebb21394df8b4114e3e87abeb5c%7C0%7C0%7C637153203084204675&sdata=NH1nVdRr9SsFOtMYhC%2BaXpdZiC7Nm%2BaUt37NvDWBfCg%3D&reserved=0>
> 
> 
> 	[[alternative HTML version deleted]]
> 
> _______________________________________________
> 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



More information about the Bioc-devel mailing list