[Bioc-devel] Meta data access with $ for GRanges vs RangedData vs data.frame

Tim Yates TYates at picr.man.ac.uk
Mon Mar 19 13:24:32 CET 2012


Obviously, my accessor method was wrong, and missing a check for non-meta
columns:

`$.GRanges`   = function( x, name )        {
  if( name %in% c( 'seqnames', 'ranges', 'strand' ) ) {
    do.call( name, list( x ) )
  }
  else {
    elementMetadata( x )[[ name ]]
  }
}

Sorry about that (it's amazing what you see as soon as you click 'send')


Cheers,

Tim Yates

On 19/03/2012 12:02, "Tim Yates" <TYates at picr.man.ac.uk> wrote:

>Hi all,
>
>I have a feeling I asked this before, but cannot find the mail, or the
>answer I received, so sorry if we're covering old ground.
>
>I have a package which can deal with data.frames, RangedData objects or
>Granges objects.
>
>Assuming I have:
>
>library( IRanges )
>library( GenomicRanges )
>
># Setup a data.frame
>df = data.frame( start=c( 1, 2 ),
>                 end=c( 3, 4 ),
>                 strand=c( '+', '+' ),
>                 name=c( 'tim', 'yates' ),
>                 more=c( T, F ) )
># Setup a RangedData object
>rd = as( df, 'RangedData' )
># Setup a GRanges object
>gr = as( rd, 'GRanges' )
>
>Then the following is the behaviour when trying to use $ for accessing
>the column 'name':
>
>print( df$name )
># [1] tim   yates
># Levels: tim yates
>
>print( rd$name )
># [1] tim   yates
># Levels: tim yates
>
>print( gr$name )
># Error in gr$meta : $ operator not defined for this S4 class
>
>Using it for assignment also gives problems:
>
>df$foo = c( 'bar', 'baz' )
># Adds new column 'foo' to df with values 'bar' and 'baz'
>rd$foo = c( 'bar', 'baz' )
># Adds new column 'foo' to rd with values 'bar' and 'baz'
>gr$foo = c( 'bar', 'baz' )
># Error in `$<-`(`*tmp*`, "foo", value = c("bar", "baz")) :
>#  no method for assigning subsets of this S4 class
>
>Now, if I add the following two methods to my code:
>
>`$.GRanges`   = function( x, name )        {
>  elementMetadata( x )[[ name ]]
>}
>`$<-.GRanges` = function( x, name, value ) {
>  elementMetadata( x )[[ name ]] = value
>  x
>}
>
>Then all the above functions behave in a similar fashion, however I don't
>want to do this in my package, as I believe it will be a gateway to
>namespace hellŠ
>
>Is there any plan to add this accessor operator to Granges so that access
>is normalised across all three of these types?
>
>Thanks!
>
>Tim Yates 
>--------------------------------------------------------
>This email is confidential and intended solely for the ...{{dropped:19}}



More information about the Bioc-devel mailing list