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
/unstick
and sticky_all
are the only interfaces to the package.
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.
install.packages('sticky')
libraty(devtools)
lnstall_github('decisionpatterns/sticky')
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.