Persist Attributes Across Data Operations

In base R, object attributes are lost when objects are modified by common data operations such as subset, filter, slice, append, extract etc. This packages allows objects to be marked as 'sticky' and have attributes persisted during these operations or when inserted into or extracted from recursive (i.e. list- or table-like) objects.

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

  • sticky: make an objects attributes persist across data operations

  • unstick: remove the stickiness of an object; attributes will no longer persist during common data opetations

  • sticky_all : make all elements of a recursive object sticky.


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:

  • Preserve attributes of atomic or recursive objects
  • Ensure that attributes of vectors in data.[frame|table] are preserved
  • Build a basic class system.


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


Version 0.5.0

  • Fix #1: sticky_all function added
  • Fix #2: Fix na.exclude issue
  • Fix #3: Fix issue with dropping dimensions

Version 0.4.0

  • #2: now matrices are properly supported.
    • Thanks jwdink.
    • Accomodate mostattributes for matrices to propogate to result of extract1.
    • Adds tests for matrices.
  • Add utils.R

Version 0.3.6

  • Fix Canonical URL using use_cran_badge()

Version 0.3.4

  • Add Badges
  • Fix vignette title
  • Update docs

Version 0.3.3

First Accepted CRAN release

Version 0.2

  • Add tests
  • Support recursive objects
  • Ready for CRAN

Version 0.1

  • Initial Release (Git Hub only)

Reference manual

It appears you don't have a PDF plugin for this browser. You can click here to download the reference manual.


0.5.2 by Christopher Brown, 2 years ago

Report a bug at

Browse source code at

Authors: Christopher Brown [aut, cre] , Decision Patterns [cph]

Documentation:   PDF Manual  

GPL-2 | file LICENSE license

Imports methods

Suggests magrittr, testthat, data.table, dplyr, knitr, rmarkdown

Imported by GenEst, ggperiodic.

See at CRAN