Sticky: Persistent Attributes

CRAN_Status_Badge Downloads

In base R, objects lose attributes in many common operations. Marking objects 'sticky', make attributes resilent to these operations: subset, [, [[<-, append, etc. or when inserted into or extracted from list-like objects such as data frames or data tables.

Basically, sticky make object attributes behave much more like attributes in other programming languages. There isn't much to the package. sticky/unstickand sticky_all are the only interfaces to the package.

Key Functions


Here is an simple example of a sticky attribute in action. Under base R, attributes do not survive a slice/subset/[ operation:

x <- 1:5
attr(x, 'foo') <- 'bar'
attr(x[1:3],'foo')        # NULL -- attribute removed 

To ensure that they get preserved, simply declare the object as sticky:

x <- sticky(x)
attr(x[1:3],'foo')        # 'bar' -- attribute preserved    

sticky() works for vectors inside table-like objects ( i.e. data.frames and data.tables), preserving their attributes during table operations.

df <- data.frame( 
  sticky   = sticky( structure(1:5, foo="bar") ),
  nonstick = structure( letters[1:5], foo="bar" )
attr( df[2:3,"nonstick"], 'foo' )  # NULL
attr( df[2:3,"sticky"], 'foo' )    # bar

sticky_all will make all members of a recursive object sticky.


Stable Version: CRAN (coming soon)


Development Version: Github


Use Cases

There are a number of things that can be done with sticky:


The issue of attribute resilence has been often asked and debated. Here are a few of the most prevalent discussions.